处于相同“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
所以你将i
与j
进行比较并得到true
。 比你true
地比较123
。 true
将转换为整数1
。 一个不等于123
,所以表达式是假的。
你需要表达式i == j && j == k
我注意到了编译器的警告并把它写成(i==j) && (j==k)
。 写入需要更长的时间,但它意味着同样的事情,并且不太可能让编译器抱怨。