数量增加到2、3和4

问题描述 投票:0回答:1

我编写了以下简单的 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++ operators variable-assignment assignment-operator compound-assignment
1个回答
1
投票

有人能解释一下这是为什么吗?

这是因为您使用的是支持 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开始,这里指定了计算顺序,您将得到直观的预期结果。

© www.soinside.com 2019 - 2024. All rights reserved.