相同“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 = 1
、j = 2
、k = 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,否。在条件句之间使用 &&。 它“很好”,但没有任何意义。那就是说“如果i
和j
的相等性与j
和k
的相等性相同。”这三个都不同将使它成为现实。你想要&&
,这意味着和。
没有。 (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
所以你比较 i
和 j
并得到 true
。比您将true
与123
进行比较。 true
转换为整数为 1
。一不等于123
,所以表达式为假。
你需要表达i == j && j == k
【讨论】:
【参考方案4】:我会留意编译器的警告并将其写为(i==j) && (j==k)
。写起来需要更长的时间,但意思是一样的,不太可能让编译器抱怨。
【讨论】:
只是为了挑剔,编译器实际上是在警告您比较比较。 虽然这显然是 Manav 的意图,但这不是编译器建议的更改。注意编译器的警告会给你这个代码:(i == j) == k
.
True:虽然编译器说suggest parentheses around comparison in operand of ‘==’
,但由于它没有指定哪个'==',我只是把它们都加了括号! ;)
更重要的是,它会做正确的事,而i == j == k
不会。以上是关于相同“if”条件下的两个“==”等式运算符未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章