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

Posted

技术标签:

【中文标题】相同“if”条件下的两个“==”等式运算符未按预期工作【英文标题】:Two '==' equality operators in same 'if' condition are not working as intended 【发布时间】:2011-01-10 10:45:36 【问题描述】:

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

【问题讨论】:

你需要 ( (i==j) && (j==k) ) 您的编辑测试i == j 是否与j == k 具有相同的值。 i = 1j = 2k = 3 会发生什么?别猜了,想办法:比如1 == 2的值是多少? Language support for chained comparison operators (x < y < z) 【参考方案1】:
  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) )

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

【讨论】:

@Manav,否。在条件句之间使用 &&。 它“很好”,但没有任何意义。那就是说“如果ij 的相等性与jk 的相等性相同。”这三个都不同将使它成为现实。你想要&amp;&amp;,这意味着和。 没有。 (i==j) == (j==k) 等价于 (i==j) ^ (j==k)。这意味着如果 i==j 和 j==k 或者如果 i!=j 和 j!=k 则为真。因为 (i==j) 返回一个真或假值。 @SurDin,它们并不等同,它们实际上完全相反(只有当我忽略结果的类型时)。【参考方案2】:

你需要分开操作:

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

【讨论】:

【参考方案3】:

表达式

i == j == k

被解析为

(i == j) == k

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

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

【讨论】:

【参考方案4】:

我会留意编译器的警告并将其写为(i==j) &amp;&amp; (j==k)。写起来需要更长的时间,但意思是一样的,不太可能让编译器抱怨。

【讨论】:

只是为了挑剔,编译器实际上是在警告您比较比较 虽然这显然是 Manav 的意图,但这不是编译器建议的更改。注意编译器的警告会给你这个代码:(i == j) == k. True:虽然编译器说suggest parentheses around comparison in operand of ‘==’,但由于它没有指定哪个'==',我只是把它们都加了括号! ;) 更重要的是,它会做正确的事,而i == j == k 不会。

以上是关于相同“if”条件下的两个“==”等式运算符未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

我的 if else 语句未按预期工作-所有语句的 innerHTML 保持不变

MySQL 索引未按预期使用

命名管道未按预期工作。一遍又一遍地阅读相同的消息

C中的电源功能未按预期工作

QML 条件绑定未按预期工作

猫鼬发现或条件未按预期工作