解释逻辑

时间:2017-10-06 13:31:20

标签: c logical-operators logical-or

  #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

2 个答案:

答案 0 :(得分:2)

由于此表达式语句的操作优先级

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

相当于

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

你可以想象它像

m = expression1 || expression2;

其中expression1++iexpression2( ++j && ++k )

根据C标准(6.5.14 Logical OR运算符)

  

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

由于expression1将不等于0(其值等于11),因此不会评估expression2

因此,仅评估expression1并且它不等于0.

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

  

3 ||如果任一操作数进行比较,则运算符将产生1   不等于0 ;否则,它产生0.结果的类型为int。

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

因此只更改了变量im。变量jk未更改,因为它们作为操作数存在的表达式未被评估。

答案 1 :(得分:0)

我从10开始,但在测试之前会增加到11。

m被赋予布尔结果,因此将为0或1。

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

因此你的输出。