我正在阅读一本有关问题的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
在我看来:
k
递增。
j
递增。
i
递增。
k&&j
将会发生。
i|| (k&&j)
因此输出应为i=2
,j=2
,k=1
。我错过了什么?
答案 0 :(得分:3)
表达式k=++i||++j&&++k;
导致未定义的行为。您试图在没有插入序列点的情况下分配给k
两次。
即使赋值是一个不同的变量,你的步骤也是不准确的 - 逻辑运算符有短路行为。
编辑:OP说他将表达式更改为a=++i||++j&&++k
。我将用完全括号和一些空格重写它:
a = ++i || (++j && ++k);
在这种情况下,由于++i
运算符的短路行为,仅评估||
。