我编写了以下简单的 C++ 程序来输出用户输入的数字的幂到索引 2、3 和 4:
int a = 0;
cin >> a;
int a2 = a * a;
cout << "\n" << a2 << "\n" << (a2 *= a) << "\n" << (a2 *= a) << "\n";
return 0;
a = 2
的输出是
16
16
16
有人能解释一下这是为什么吗?
有人能解释一下这是为什么吗?
这是因为您使用的是支持 C++14 或更早版本的 C++ 编译器。
在 C++17 之前,C++ 标准未指定以下表达式的计算顺序:
cout << "\n" << a2 << "\n" << (a2 *= a) << "\n" << (a2 *= a) << "\n";
C++14 及更早版本允许 C++ 编译器为此表达式实现任何计算顺序。在 C++17 之前,允许(但不是必需),首先计算两个
a2 *= a
表达式,将 a2
设置为 16
,最后,得到 cout
三次。
作为一般经验法则:除非指定了计算顺序,否则完全取决于编译器以任何顺序计算表达式。例如,对于
int x=foo() + bar();
,可以先调用 foo()
或 bar()
,然后再调用另一个。 C++ 标准未指定 +
操作数的求值顺序。使用 <<
运算符的表达式是一样的。
在 C++17 之前,上述语句可能会使用不同的 C++ 编译器产生不同的输出,具体取决于它们选择的评估顺序。这完全取决于他们。
从C++17开始,这里指定了计算顺序,您将得到直观的预期结果。