Два «==» оператора равенства в одном и том же условии «если» не работают должным образом - PullRequest
11 голосов
/ 28 января 2010

Я пытаюсь установить равенство трех равных переменных, но следующий код не выводит очевидный правильный ответ, который он должен напечатать. Может кто-нибудь объяснить, как компилятор внутренне анализирует данные 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:~$

EDIT:

Исходя из ответов, приведенных ниже, можно ли с помощью следующего утверждения проверить выше равенство?

if ( (i==j) == (j==k))

Ответы [ 4 ]

24 голосов
/ 28 января 2010
  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) )

... отсюда и неправильный ответ;)

9 голосов
/ 28 января 2010

Вам необходимо разделить операции:

  if ( i == j && i == k)
8 голосов
/ 28 января 2010

Выражение

i == j == k

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

(i == j) == k

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

Вам нужно выражение i == j && j == k

7 голосов
/ 28 января 2010

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

...