Я пытаюсь установить равенство трех равных переменных, но следующий код не печатает очевидный корректный ответ, который это должно распечатать. Может кто-то объяснять, как компилятор анализирует данный 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;
}
Вывод:
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:~$
Править:
При движении ответами, данными ниже, следующее утверждение должно хорошо проверить выше равенства?
if ( (i==j) == (j==k))
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
, чтобы j
и Get True
. Чем вы сравните true
- 123
. True
преобразуется в целое число как 1
. Один не равен 123
, поэтому выражение является ложным.
Вам нужно выражение I == J && J == K
Я бы сказал предупреждение компилятора и написать его как (i == j) && (j == k)
. Требуется больше времени, но это означает одно и то же, и вряд ли заставит компилятор жаловаться.