具有增量和逻辑运算符的复杂表达式的意外行为

时间:2013-09-11 20:45:06

标签: c operators logical-operators

我正在阅读一本有关问题的C目标书:

#include<stdio.h>
#include<conio.h> 
int main()
{
    int i,j,k;
    i=j=k=1;
    k=++i||++j&&++k;
    printf("%d %d %d",i,j,k);
    return 0;
}

输出结果为:

2 1 1

在我看来:

  1. k递增。

  2. j递增。

  3. i递增。

  4. k&&j将会发生。

  5. i|| (k&&j)

  6. 因此输出应为i=2j=2k=1。我错过了什么?

1 个答案:

答案 0 :(得分:3)

表达式k=++i||++j&&++k;导致未定义的行为。您试图在没有插入序列点的情况下分配给k两次。

即使赋值是一个不同的变量,你的步骤也是不准确的 - 逻辑运算符有短路行为。

编辑:OP说他将表达式更改为a=++i||++j&&++k。我将用完全括号和一些空格重写它:

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

在这种情况下,由于++i运算符的短路行为,仅评估||