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)
...因此错误的答案;)
表达
i == j == k
Run Code Online (Sandbox Code Playgroud)
被解析为
(i == j) == k
Run Code Online (Sandbox Code Playgroud)
所以,你比较i到j并获得true.比你比较true来123.true被转换为整数1.一个不相等123,所以表达式是假的.
你需要表达 i == j && j == k
| 归档时间: |
|
| 查看次数: |
3513 次 |
| 最近记录: |