可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
Undefined Behavior and Sequence Points
好的我们都知道i ++在下一行将值增加1并且++ i在同一行增加(如果我错了,请纠正我)
所以对于c的示例语句如下:
int a=0;
printf("%d , %d",++a,a);
预期输出应为1 , 1
,而是提供1 , 0
所以我可能会猜到我在这里要问的是为什么第二次连接
当值已经增加时,i
打印0
而不是1
。
因此,如果后期增量没有在同一行中增加值那么是什么
post和pre increment之间的区别?
编辑:将变量名从i更改为a以避免语法混淆。
答案 0 :(得分:4)
你对增量运算符的理解是非常错误的。
i++
递增i
,并返回其旧值; ++i
增加i
,
并返回新值。当实际增量发生时
只保证在前一个序列点之后,之前
下一个;在您的代码中,这意味着在调用printf
之前。
除此之外(主要是因为这个),如果你修改了一个的值 对象,你不允许在任何其他地方访问它 干预序列点,除非需要确定新值。 您违反了此规则,因此您的代码具有未定义的行为。
答案 1 :(得分:1)
这是未定义的行为。允许编译器以任何顺序计算参数。你的编译器只是从右到左计算它,所以最右边的参数是0,第二个是1。
编辑:正如Seth所说,编译器只能随意改变计算顺序,而不是做任何想做的事情,所以当你不关心顺序时你可以随意调用函数,但是你永远不应该假设在另一个参数之前计算了一个参数。
答案 2 :(得分:1)
我认为你的问题不在于增量是如何运作的。您观察到的现象是将参数传递给函数的顺序。据我所知,这不是由c ++标准定义的,所以它是一个未定义的行为。意思是不同的编译器可以有不同的实 例如。 一个编译器可以从左到右传递参数,然后另一个可以从右到左传递参数。
您可以在此处更好地阅读序列点: http://en.wikipedia.org/wiki/Sequence_point
答案 3 :(得分:1)
printf("%d , %d",++i,i);
是未定义的行为。
您违反了C序列点规则:
(C99,6.5p2)"在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。此外,先前的值应该是只读的,以确定要存储的值。"
答案 4 :(得分:1)
我读过一本书后,当一个陈述是这样的时候:
printf(“%d,%d”,++ a,a);
执行从右到左开始,但从左到右输出。因此你看到out为1 0 - 'a'首先计算= 0然后'++ a'= 1,但显示为1 0
这很奇怪,但是它是如何运作的。
希望这有帮助。