приоритет и выполнение операторов в заявлении - PullRequest
0 голосов
/ 21 мая 2019

не может понять, как булевой переменной "check" присваивается 1 или 0. здесь 2 == 2 верно, но 2 не равно 3, поэтому оно должно быть ложным .....

/* practicing the precedence of assignment operator */

#include <stdio.h>

int main() {

    _Bool check;
    check = (2 == 2 != 3);

    printf("the value of _Bool is %d\n",check);


    return 0;
}

Я ожидаю, что результат будет ложным

Ответы [ 3 ]

1 голос
/ 21 мая 2019

То, что на самом деле происходит, выглядит следующим образом:

(2 == 2 != 3)

становится

(2 == 2) != 3)

, что составляет

(1 != 3)

, что, в свою очередь, становится

(1)

Возможно, вам нужно было

(2 == 2 && 2 != 3)
0 голосов
/ 21 мая 2019

Оператор приоритет одинаков для == и !=, так как они оба принадлежат одним и тем же операторам группового равенства. Чтобы отделить операторы с одинаковым приоритетом, мы используем операторную ассоциативность этой группы, в данном случае слева направо. Это означает, что 2 == 2 != 3 гарантированно будет проанализировано как (2 == 2) != 3. Итак, мы получаем:

  • 2 == 2 -> 1
  • 1 != 3 -> 1

Примечательно, что и ==, и != имеют более высокий приоритет, чем =, поэтому скобки в вашем выражении = (2 == 2 != 3) не нужны (но рекомендуется использовать их, если вы не уверены в приоритетах).


Относительно порядка выполнения / оценки , это еще один термин, который не следует путать с приоритетом оператора. Порядок вычисления операндов == и != в вашем выражении не указан, то есть мы не можем знать, какой из них будет выполнен первым.

В этом случае это не имеет значения, но если бы у нас было это check = a() == b() != c();, оно могло бы иметь. Здесь мы не можем знать, какие из 3 функций выполняются первыми. Мы только знаем, что приоритет оператора говорит, что результат a должен сравниваться с результатом b перед результатом c, но функция c все еще может выполняться в первую очередь.

0 голосов
/ 21 мая 2019

Две вещи:

...