C++ 递增std::cout中的变量时,指针不显示更新的值
案例2:C++ 递增std::cout中的变量时,指针不显示更新的值,c++,pointers,operator-precedence,C++,Pointers,Operator Precedence,案例2: a is 5. b is 5. c is 5. a is 10. b is 10. c is 10. 案例3: a is 5. b is 5. c is 5. a is 11. b is 11. c is 10. 我理解案例1。但是我很难理解案例2和案例3。有人能解释一下为什么在这两种情况下,c都不能用新值更新吗?操作数的求值顺序是未指定的,您在修改对象并读取它时,没有对这些操作进行排序 因此,您的程序与cout一样未定义,我认为您的问题是由所谓的序列点造成的。您可以在中对此有很
a is 5. b is 5. c is 5.
a is 10. b is 10. c is 10.
案例3:
a is 5. b is 5. c is 5.
a is 11. b is 11. c is 10.
我理解案例1。但是我很难理解案例2和案例3。有人能解释一下为什么在这两种情况下,
c
都不能用新值更新吗?操作数的求值顺序是未指定的,您在修改对象并读取它时,没有对这些操作进行排序
因此,您的程序与
cout一样未定义,我认为您的问题是由所谓的序列点造成的。您可以在中对此有很长的了解,但用几句话来说,它基本上说明了表达式元素的顺序或求值
更新在您的情况下,这个顺序是未定义的,尽管有些编译器似乎是从右向左的。您可以添加输出是未定义的,因为的操作顺序看起来像未定义和/或未指定的行为。甚至可能取决于C++使用的标准版本。排序和运算符优先级的规则几乎极其复杂,请参见和。我个人的规则是不要访问在同一个表达式中应用了++
的对象,这有点模糊。“任何事情都可能发生”使它看起来像是未定义的行为,但如果使用旧C++(C++ 11之前)才是正确的。“未定义为…”是正确的,但没有帮助;我认为这实际上是“C++03中的UB;C++11及更高版本中未指定”,因为OP和cout@anatolyg操作数计算在C++11中都是不排序的(§1.9,第15项),导致未定义的行为。我相信17改变了这一点。
a is 5. b is 5. c is 5.
a is 11. b is 11. c is 10.
a is 5. b is 5. c is 5.
a is 11. b is 10. c is 10.