C 语言和运算符


#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的值用于选择分支。

相关内容

  • 没有找到相关文章

最新更新