增量如何工作?

可能重复:
任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等)
未定义的行为和序列点

好的,我们都知道i ++在下一行增加1,而++ i在同一行增加
(如果我在那里错了,请纠正我)
所以对于c的一个样本陈述如下:

int a=0;  
printf("%d , %d",++a,a);  

预期的输出应该是1 , 1但是它会给出1 , 0所以人们可能会猜测我在这里问的是为什么当值已经增加时, i的第二个链接打印0而不是1

所以如果后增量没有增加价值在同一行那么后和前增量有什么区别?
编辑:将变量的名称从我更改为a,以避免语法混淆。


你对增量操作符的理解是错误的。 i++增加i ,并返回其旧值; ++i增加i ,并返回新的值。 当实际增量发生时,只能保证在前一个顺序点之后,在下一个之前; 在你的代码中,这意味着在调用printf之前。

除此之外(主要是因为这一点),如果修改对象的值,则不允许在没有中间顺序点的地方访问它,除非需要确定新值。 你违反了这个规则,所以你的代码有未定义的行为。


这是未定义的行为。 允许编译器以任何顺序计算参数。 你的编译器只是从右到左计算它,所以最重要的参数是0,第二个是1。

编辑:正如Seth所说,编译器只能自由地改变计算顺序,而不是做任何想做的事情,所以当你不关心顺序时可以自由地调用函数,但是你绝不应该假定一个参数是在另一个之前被计算。


我认为你的问题不是关于如何增加工作。 你观察到的现象是关于将参数传递给函数的顺序。 据我记忆,这不是由c ++标准定义的,所以它是一个未定义的行为。 含义不同的编译器可能有不同的实现 例如,一个编译器可以从左向右传递参数,然后不同的参数可以从右向左传递参数。

您可以在这里更好地阅读序列点 :http://en.wikipedia.org/wiki/Sequence_point

链接地址: http://www.djcxy.com/p/73243.html

上一篇: how does increment work?

下一篇: Multiple increment operators in single statement