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