-7
  #include <stdio.h>
 //Compiler version gcc 6.3.0

 int main(void)
 {
    int i=10, j=2, k=0, m;
    m=++i || ++j && ++k;
    printf("%d,%d,%d,%d",i,j,k,m);
 }

谁能解释一下逻辑,输出是11,2,0,1

4

2 回答 2

2

由于操作的优先级,这个表达式语句

m=++i || ++j && ++k;

相当于

m = ++i || ( ++j && ++k );

你可以想象它像

m = expression1 || expression2;

在哪里和expression1++iexpression2( ++j && ++k )

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

4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数

由于expression1比较不等于 0(其值等于 11)expression2,则不进行评估。

因此 onlyexpression1被评估并且它不等于 0。

根据 C 标准同一部分的另一个引用

3 || 如果任一操作数比较不等于 0 ,则运算符应产生 1 ;否则,它产生 0。结果具有 int 类型。

右侧的评估结果等于分配给变量的 1 m

因此只有变量im被改变了。变量jk没有改变,因为它们作为操作数存在的表达式没有被计算。

于 2017-10-06T13:55:56.423 回答
0

i 从 10 开始,但在测试之前递增到 11。

m 被分配一个布尔结果,因此将是 0 或 1。

i 不为零,因此对于布尔表达式的计算结果为 true,因此,|| 之后的表达式 不需要评估,因为 || 是一个布尔短路评估器。

因此你的输出。

于 2017-10-06T13:49:47.693 回答