12

我正在尝试建立三个相等变量的相等性,但以下代码没有打印它应该打印的明显正确答案。有人可以解释一下,编译器是如何在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))
4

4 回答 4

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

...因此错误的答案;)

于 2010-01-28T14:47:54.057 回答
9

您需要分离操作:

  if ( i == j && i == k)
于 2010-01-28T14:48:01.607 回答
8

表达

i == j == k

被解析为

(i == j) == k

所以你比较ij得到true. 比你true123true被转换为整数1。一不等于123,所以表达式为假。

你需要表达i == j && j == k

于 2010-01-28T14:53:09.567 回答
7

我会留意编译器的警告并将其写为(i==j) && (j==k). 编写需要更长的时间,但它意味着同样的事情,并且不太可能让编译器抱怨。

于 2010-01-28T14:48:10.873 回答