有人可以解释为什么程序的输出是
0 1 1 3 1
void main(void)
{
int i=-1,j=0,k=1,l=2,m;
m=i++&&j++&&k++||l++;
printf("%d %d %d %d %d",i,j,k,l,m);
}
主要关注的是“为什么不增加k”。
仅供参考..我正在 VC++ 编辑器 Windows 7 32 位中编译程序。提前谢谢了。
有人可以解释为什么程序的输出是
0 1 1 3 1
void main(void)
{
int i=-1,j=0,k=1,l=2,m;
m=i++&&j++&&k++||l++;
printf("%d %d %d %d %d",i,j,k,l,m);
}
主要关注的是“为什么不增加k”。
仅供参考..我正在 VC++ 编辑器 Windows 7 32 位中编译程序。提前谢谢了。
大致:
要评估i++&&j++
,编译器i
首先评估。结果是-1
。-1
存储在临时变量中。然后i
就加分了。
因为-1
不为零,所以编译器评估j
了 ,即0
。编译器现在评估-1 && 0
,即0
. 然后j
就加分了。
此时,i = 0
和j = 1
。剩余表达式:m=0&&k++||l++;
为了评估0&&k++
,编译器注意到第一个操作数是0
. 结果必须是0
这样编译器没有评估k
or k++
。剩余表达式:m=0||l++;
我希望你能做剩下的。:)
让我们将其分解为单独的操作:
i++ && j++
:这将与 相同-1 && 0
,即为假(即 0)。i
然后分别j
增加到0
和1
。0 && k++
: 零来自上一个逻辑运算,结果为假,因为第一个运算符为假。k
不会增加,因为逻辑运算符的快捷性质。0 || l
: 零仍然来自先前的逻辑运算,它是0 || 2
并且结果将为真,即1
。l
增加到3
.m
,现在变为真(即1
)整个表达式导致i
,增加,j
并成为。只是你看到的结果。l
m
1
您的价值计算如下
m=((((i++)&&j++)&&k++)||l++);
因为所有 ++ 都是后增量,所以在计算 m 期间,所有变量的值都与您初始化的值相同,但在打印期间的下一行,它们都被递增。最后是 || 所以最终的 TRUE 将返回 m 的值。