Чому це, якщо твердження з перевіркою присвоєння та рівності оцінюється як помилкове?


105

Як працює Java, якщо оператор працює, коли він має призначення та перевірку рівності OR-d разом ??

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

Чому цей друк ЛАЖНИЙ?


1
Виконати і перевірити. Подивіться, яке булеве значення друкується, якщо ви присвоїли помилкові та якщо призначили істинні. Потім читайте про те, як працює АБО.
Пратік

2
Я хотів би сказати , що цей код в режимі налагодження дає справжнє значення і на робочому режим дає БРЕХНЯ значення ... Чому це так ??? ... (я кладу точку зупину , якщо умова) ...
CoderNeji

test1=false, test1==falseє false, false || falseє, false or falseщо є false.
Джаред Берроуз

Я знаю, що ви не просили поради, але оскільки відповіді нижче визначають питання пріоритетності, ось декілька практик, які допомогли мені уникнути неприємностей (коли я дотримуюся цього): (1) завжди використовуйте дужки, коли не на 100% певний пріоритет або для легшого розбірливості, щоб допомогти іншим розробникам. Не припускайте, що інші пам’ятатимуть правила пріоритетності для всіх операторів (2), якщо взагалі слід уникати присвоєнь, щоб зменшити плутанину, за винятком дуже простих умов if. Існують деякі поширені винятки (особливо це стосується простих перевірок на введення / виведення, мереж тощо). Всього два мої центи.
rimsky

тому щоtest1 = true
jono

Відповіді:


189

Вираз не розбирається так, як ви думаєте. Це не

(test1=false) || (test1 == false)

у такому випадку результат був би true, але

test1 = (false || test1 == false)

Значення false || test1 == falseвираження обчислюється спочатку, і воно є false, тому що test1воно задається тим, що trueйде в обчислення.

Причина він обробляється таким чином, що перевага з ||нижче , ніж у ==оператора, але вище , ніж пріоритет оператора присвоювання =.


2
+1 @RohanFernando, також зауважте, що якщо ви додасте дужки навколо завдання так: ((test1 = false) || test1 == false)загальне значення буде true.
Арнон Зілка

1
Будь ласка, напишіть причину, чому розбір трапляється так ... Це через черговість порядку операторів?
конду

3
@kondu Це справедливе подальше запитання, я редагував, щоб додати посилання до таблиці пріоритетів, яке показує, що ==вище ||, але =нижче ||.
dasblinkenlight

Заключний абзац вводить в оману, в тому сенсі, що для розуміння того, чому обраний другий синтаксичний аналіз, а не перший, достатньо знати правило (яке легко запам'ятовується), що присвоєння має нижчий пріоритет перед будь-яким оператором без призначення (тут ||). Відносний пріоритет ||і ==має значення лише , щоб показати , що парсинг НЕ як у test1 = ((false || test1) == false), який я не думаю , що хто б розумно очікувати (до речі , що відносний пріоритет, або в більш загальному плані, що ||, &&мають більш низький пріоритет , ніж відносини, також легко пам’ятайте, оскільки використовували весь час).
Марк ван Левен

1
@MarcvanLeeuwen відносного пріоритету ||і ==проти , ||і =пояснює , чому це поводиться по- різному від (загального) випадку a == b || c == d.
Аарон Дюфур

83

Це в основному питання пріоритету. Ви припускаєте, що ваш код еквівалентний:

if ((test1 = false) || (test1 == false))

... але це не так. Це насправді еквівалентно:

if (test1 = (false || test1 == false))

... що еквівалентно:

if (test1 = (false || false))

(бо test1єtrue почати с)

... що еквівалентно:

if (test1 = false)

який присвоює значення falseдо test1, з результатом вираження істотfalse .

Дивіться підручник Java щодо операторів для корисної таблиці пріоритету оператора.


2

будь ласка, перегляньте перевагу операторів

Вираз test1 = false || test1 == falseбуде оцінено на наступному кроці.

КРОК: 1- test1 = false || test1 == false // пріоритет ==найвищий

КРОК: 2- test1 = false || false // Оператор ||має вищий пріоритет

КРОК: 3- test1 = false

КРОК: 4- false

Оскільки булеве значення виразу стає хибним. Інше оператор виконується.


-11

(test1 = false || test1 == false)повертає помилковим, оскільки вони обоє помилкові. (test1 = false || test1 == true)це правда, тому що одна з них є правдою


1
Зовсім неправильно. Чому ви відповіли б такою невірною інформацією через кілька днів після того, як на запитання надійшли дві якісні відповіді, які описують, що відбувається?
l4mpi

5
Два відповіді такої низької якості не заслуговують на індивідуально написані коментарі. Ви розумієте, що ваша відповідь - це нісенітниця, правда? Якщо ні, уважно прочитайте два відповіді Джона та блимайте.
l4mpi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.