数组中的自增运算符

Increment Operator in arrays C++

本文关键字:运算符 数组      更新时间:2023-10-16

以下代码给出的输出如下:

int t = 0;
char a[] = {'a', 'b', 'c'};
cout<<a[t]<<a[++t]<<a[++t];

我想知道,在生成指定输出的代码中实际发生了什么。

我的第一反应是:c++不能保证像

这样的语句的求值顺序。
cout<<a[t]<<a[++t]<<a[++t];

你需要做如下的事情:

cout<<a[t]<<a[t + 1]<<a[t + 2];
t += 3;

经进一步审核,针对R Sahu的评论(谢谢):由于运算符<<是一个函数调用,函数调用是一个序列点。然而,订单不会像预期的那样。在这种情况下,t++操作按照从右到左的顺序执行,因为每个函数调用的参数必须在调用之前求值。也就是说,这个语句实际上是:

cout ( << a[t] ( << a[++t] ( << a[++t] ) ) ) ;

和最里面的短语先求值。

当然,上面的括号表达式是无效的。从技术上讲,我应该说:

operator << (operator << ( operator << ( cout, a[++t]), a[++t]), a[t]);

,但这是令人困惑的,因为为了以这种形式编写表达式,我必须颠倒索引操作符的顺序(这是编译器所做的)。

最后,作为对Baum评论的回应:即使以这种方式将其分解为函数调用也不能使调用确定,因为函数参数的求值顺序没有指定,因此可以在求a[t]之前求operator << (cout, a[++t])

在复杂语句中避免副作用操作的解决方案仍然有效。

未指定求值顺序。https://en.wikipedia.org/wiki/Sequence_point