-1

我正在阅读一本 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)

所以输出应该是i=2, j=2, k=1. 我错过了什么?

4

1 回答 1

3

该表达式k=++i||++j&&++k;导致未定义的行为。您正在尝试分配k两次,而没有中间的序列点。

即使分配给不同的变量,您的步骤也会不准确 - 逻辑运算符具有短路行为。

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

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

在这种情况下,++i由于操作员的短路行为,只评估||

于 2013-09-11T20:47:26.523 回答