增量如何运作?

时间:2012-01-12 17:14:18

标签: c++ c pre-increment

  

可能重复:
  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以避免语法混淆。

5 个答案:

答案 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

这很奇怪,但是它是如何运作的。

希望这有帮助。