可能重复:
Undefined Behavior and Sequence Points
pre fix and post fix increment in C
请解释此程序如何打印i = 2
#include<stdio.h>
void main()
{
int i=1;
i=i+2*i--;
printf("%d",i);
}
根据逻辑,它应该评估值3,因为 - 1 + 2 * 1 = 3 但这首先评估i--并更新i的值。为什么会这样? :S
答案 0 :(得分:3)
修改表达式中的变量,然后将该结果分配给同一个变量是未定义的行为,因此您所看到的任何行为在技术上是正确的(包括重新启动计算机,或摧毁宇宙)。来自C standard,§6.5.2:
在前一个和下一个sequence point之间,一个物体应具有它 储值通过评估一次最多修改一次 表达
要解决此问题,请将后递减移出表达式,如下所示:
int main() {
int i=1;
i=i+2*i;
i--;
printf("%d",i);
return 0;
}
答案 1 :(得分:2)
i=i+2*i--;
此代码调用未定义的行为。您正在修改i
并在单个序列点内读取它。请阅读Sequence Points。
答案 2 :(得分:-1)
i = i + 2 * i--;
i = 1 + 2 * 1; (as it is post decrement so the i value is still 1)
i = 1 + 2; (multiplication has higher priority, post decrement still not made)
i = 3 ;
on the next statement
printf("%d",i); the post decrement is done here on i and i value is 3 so 3 -1 = 2
The output is 2
对相同的陈述进行预先减少或预先递增,而在下一个陈述中进行后递增和后递减。我记得我在某个地方看过它 这是我已经解释过,让你明确前后操作
但主要是相信 当您尝试对要赋予值的同一变量执行递增和递减操作时,ITS未定义行为