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

man*_*m-n 11 c c++ compiler-construction operators equals-operator

我试图建立三个相等变量的相等,但下面的代码不打印应该打印的明显正确的答案.有人可以解释,编译器如何解析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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

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:~$
Run Code Online (Sandbox Code Playgroud)

编辑:

通过下面给出的答案,以下声明可以检查上面的相等吗?

if ( (i==j) == (j==k))
Run Code Online (Sandbox Code Playgroud)

Kor*_*icz 24

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

  i == j -> true -> 1 
  1 != 123 
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况

 if ( i == j && j == k ) {
Run Code Online (Sandbox Code Playgroud)

要这样做:

 if ( (i==j) == (j==k))
Run Code Online (Sandbox Code Playgroud)

你会得到i = 1,j = 2,k = 1:

 if ( (false) == (false) )
Run Code Online (Sandbox Code Playgroud)

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

  • @SurDin,它们不是等价的,它们实际上是相反的(只有当我忽略结果的类型时). (2认同)

Vin*_*nie 9

您需要分开操作:

  if ( i == j && i == k)
Run Code Online (Sandbox Code Playgroud)


Tad*_*pec 8

表达

i == j == k
Run Code Online (Sandbox Code Playgroud)

被解析为

(i == j) == k
Run Code Online (Sandbox Code Playgroud)

所以,你比较ij并获得true.比你比较true123.true被转换为整数1.一个不相等123,所以表达式是假的.

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


Fru*_*ner 7

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