处于相同“if”条件的两个“==”相等运算符未按预期工作

我试图建立三个相等变量的相等,但下面的代码不打印应该打印的明显正确的答案。 有人可以解释,编译器如何在内部解析给定的if(condition)

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

…因此错误的答案;)

您需要分开操作:

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

表达

 i == j == k 

被解析为

 (i == j) == k 

所以你将ij进行比较并得到true 。 比你true地比较123true将转换为整数1 。 一个不等于123 ,所以表达式是假的。

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

我注意到了编译器的警告并把它写成(i==j) && (j==k) 。 写入需要更长的时间,但它意味着同样的事情,并且不太可能让编译器抱怨。