Два оператора равенства '==' в том же состоянии "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). Это займет больше времени, но это означает одно и то же и вряд ли заставит компилятор жаловаться.