Два '==' операторы равенства в том же, 'если' условие не работает, как предназначено

Я пытаюсь установить равенство трех равных переменных, но следующий код не печатает очевидный корректный ответ, который это должно распечатать. Может кто-то объяснять, как компилятор анализирует данный 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))
11
задан Kshitij Saraogi 9 July 2015 в 08:07
поделиться

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) )

. .. отсюда неверный ответ;)

24
ответ дан 3 December 2019 в 01:02
поделиться

Вам нужно отделить операции:

  if ( i == j && i == k)
9
ответ дан 3 December 2019 в 01:02
поделиться

Выражение

i == j == k

анализируется как

(i == j) == k

, поэтому вы сравниваете I , чтобы j и Get True . Чем вы сравните true - 123 . True преобразуется в целое число как 1 . Один не равен 123 , поэтому выражение является ложным.

Вам нужно выражение I == J && J == K

8
ответ дан 3 December 2019 в 01:02
поделиться

Я бы сказал предупреждение компилятора и написать его как (i == j) && (j == k) . Требуется больше времени, но это означает одно и то же, и вряд ли заставит компилятор жаловаться.

7
ответ дан 3 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: