C++ 求值顺序和可能的结果

Mat*_*ati 1 c++ pre-increment

考虑以下代码:

#include <iostream>

int main()
{
    int i = 0;
    std::cout << ++i << ' ' << --i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

Nicolai Josuttis 在他的《C++17 完整指南》一书中写道,在C++17之前,这个特定的示例可能会产生不可预测的结果。和1 0都0 1可能被产生,但更重要的0 0是还有可能的输出。我不明白为什么第三个序列应该被考虑为可能的。应该在评估第二个值之前评估++ior ,根据定义,第二个值不能产生两个零,不是吗?--i

yur*_*hek 5

在C++17之前,0 0结果大概是这样的。

  1. ++i被评估。i现在商店1。该表达式的结果(重要的是,它是对 的左值引用i,而不是右值1)被保留为运算符的参数<<。
  2. --i被评估。i现在商店0。该表达式的结果(重要的是,它是对 的左值引用i,而不是右值0)被保留为运算符的参数<<。
  3. <<运算符被求值,其中两个参数都是对ivalue 的引用0。