6
#include <stdio.h>
void main()
{
    int x = 1, y = 0, z = 5;
    int a = x && y || z++;
    printf("%d", z);
}

这产生输出为 6 而

#include <stdio.h>
void main()
{
    int x = 1, y = 0, z = 5;
    int a = x && y && z++;
    printf("%d", z);
}

这将产生答案为 5。为什么?有人请解释一下。

4

3 回答 3

6

这是由于短路机制

这意味着当逻辑运算符的结果已经确定时,表达式的其余部分根本不会被计算,包括潜在的副作用。

第一个代码片段的行为类似于:

int a = (1 && 0) /* result pending... */ || z++;

第二个:

int a = (1 && 0) /* result determined */;

发生这种情况是因为如果左侧表达式为假,则逻辑 AND 的值已知为假。

于 2015-12-27T19:17:39.613 回答
6

正如您可能知道的那样,两个代码片段之间的区别在于第一个评估z++,而另一个不评估。

第二个代码不计算的原因z++是它前面的表达式计算为false,因此&&链接“短路”最后一项的计算。

||另一方面,运算符只有在左侧为 时才会短路true

于 2015-12-27T19:20:01.863 回答
2

对于初学者,不带参数的函数 main 应声明为

int main( void )

在第一个程序中,初始化表达式可以表示为

int a = ( x && y ) || ( z++ );

根据 C 标准(6.5.14 逻辑或运算符)

  1. ...如果第一个操作数比较不等于 0,则不计算第二个操作数。

表达式的第一个操作( x && y )数等于 0,因为 y 由 0 初始化

int x = 1, y = 0, z = 5;

所以第二个操作数( z++ )被评估。

结果 z 将等于 6。

在第二个程序中,初始化表达式可以用与第一个程序相同的方式表示

int a = ( x && y ) && ( z++ );

根据 C 标准(6.5.13 逻辑与运算符)

  1. ...如果第一个操作数比较等于 0,则不计算第二个操作数。

和之前一样,( x && y )表达式的第一个操作数等于 tp 0 并且根据引用,第二个操作数( z++ )不被计算。

结果 z 将像以前一样等于 5。

于 2015-12-27T19:51:12.323 回答