#include <stdio.h>
int main()
{
int i=2;
if(i==3,4)
{
printf("If block");
}
else
{
printf("Else block");
}
return 0;
}
为什么此代码返回"If block"?
if
语句中的表达式:
(i==3,4)
包含逗号运算符。 它计算其左操作数,丢弃其值,然后计算右操作数,即其结果。 这个运算符的优先级也低于相等运算符==
,所以解析为:
((i==3),4)
因此,首先评估i==3
。 由于i
的值为 2,因此比较为假,导致i==3
计算结果为 0。 此值将被丢弃。 然后计算4
,成为整个表达式的值。 由于此值不为零,因此if
块为真,因此打印"If 块"。
在 if 语句的条件下
if(i==3,4)
使用了逗号运算符。
来自 C 标准(6.5.17 逗号运算符)
2 逗号运算符的左操作数被计算为 void 表达;在其评估和 正确的操作数。然后计算正确的操作数;结果 有它的类型和价值
那就是上面的 if 语句可以等效地写成
if( ( i==3 ), ( 4 ))
所以根据C标准的引用,左操作数(i == 3)被计算为一个void表达式,即它的结果被丢弃。整个表达式的结果是表达式( 4 )
的右操作数的值。由于此表达式不等于 0,因此整个条件被计算为逻辑 true,并执行 if 语句的子语句。
"为什么这段代码返回'If block' ?''">
表达式if(i==3,4)
导致执行流转到 true 分支的原因在其他答案中提供了非常详细的解释。 简而言之,它计算其第一个操作数并丢弃结果的想法,然后使用第二个操作数作为条件进行计算。
但是,有些人可能会问这有用吗?
一种用途是在决定流向哪个分支之前强制产生副作用。
例如
if (numeric_read(str, &err), !err)
// ^ ^ result 'err' of side effect used in if evaluation.
^
// causes side effect by call function which assigns value to err.
(信用,在评论中。
这里的副作用填充err
,然后丢弃第一个参数中调用的逻辑结果。 然后,分配给err
的值用于选择分支。