增量如何工作?
可能重复:
任何人都可以解释这些未定义的行为(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