以下代码的输出是什么?

以下代码的输出是什么?

问题描述:

会是怎样的代码的输出以下代码的输出是什么?

int a=3,b=4;
++a*=++b;
cout<<a<<endl;

编译器显示a=20 output.How precedenceoperator associativity正在这里使用?

我的理解是:

上的++a*=++b;左侧第一b递增我们的unary操作然后是 转*=所以 表情变得++a = a * ++b;a=3b=5现在使它成为15然后15是分配到a并递增。最后得到16但编译器给出20

+2

您的理解错误。你的代码修改'a' *两次*没有插入*序列点*。因此你的代码有*未定义的行为*。详细解释请参阅cHao的链接。 – john 2013-04-22 21:14:05

+1

@john - 这是一种正式的说法,即编译器不必处理这种****。 – 2013-04-22 21:18:23

+0

由于缺乏序列点,这是未定义的行为。这可能是4 * 5 = 20;然而,你不知道++ a的结果是什么,所以它是未定义的。 – 2013-04-22 21:18:36

在你的particula在你的特定编译器中,似乎前a增加到4,b增加到5,然后a * = b执行,a变成20(4 * 5)。但是其他编译器可能会给出不同的结果,因为它不是人们在评论中提到的定义的行为

+0

这是对观察到的行为的合理解释。一般来说,行为是不确定的。 – 2013-04-22 21:17:49

+0

在C和C++的标准中明确规定,当您修改同一个对象两次而没有中间的序列点时,行为未定义。数学碰巧行得通,没有任何意义;它可能与另一个编译器完全不同,或者在同一个程序的运行之间运行......或者,从技术上讲,请将您的计算机着火。 – cHao 2013-04-22 21:18:45

+0

我认为++ a和++ b总是会在乘法之前发生,那是错的吗? – Martinsos 2013-04-22 21:18:49