Два оператора равенства '==' в том же состоянии "if" не работают должным образом
Я пытаюсь установить равенство трех равных переменных, но следующий код не печатает очевидный правильный ответ, который он должен печатать. Может кто-нибудь объяснить, как компилятор проводит синтаксический анализ данного if(condition)
внутри?
#include<stdio.h>
int main()
{
int i = 123, j = 123, k = 123;
if ( i == j == k)
printf("Equal\n");
else
printf("NOT Equal\n");
return 0;
}
Вывод:
[email protected]:~$ gcc -Wall -pedantic calc.c
calc.c: In function ‘main’:
calc.c:5: warning: suggest parentheses around comparison in operand of ‘==’
[email protected]:~$ ./a.out
NOT Equal
[email protected]:~$
EDIT:
Следуя приведенным ниже ответам, следует следующее утверждение: проверить правильность равенства?
if ( (i==j) == (j==k))
Ответы
Ответ 1
if ( (i == j) == k )
i == j -> true -> 1
1 != 123
Чтобы избежать этого:
if ( i == j && j == k ) {
Не делать это:
if ( (i==j) == (j==k))
Вы получите для я = 1, j = 2, k = 1:
if ( (false) == (false) )
... следовательно, неправильный ответ;)
Ответ 2
Вам нужно отделить операции:
if ( i == j && i == k)
Ответ 3
Выражение
i == j == k
анализируется как
(i == j) == k
Итак, вы сравниваете i
с j
и получаете true
. Чем вы сравните true
с 123
. true
преобразуется в целое число как 1
. Один не равен 123
, поэтому выражение ложно.
Вам нужно выражение i == j && j == k
Ответ 4
Я прислушался к предупреждению компилятора и напишу его как (i==j) && (j==k)
. Это займет больше времени, но это означает одно и то же и вряд ли заставит компилятор жаловаться.