数组 C++ 中的增量运算符
Increment Operator in arrays C++
以下代码给出的输出为:ccb
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++
操作以从右到左的顺序执行,因为必须在调用之前评估每个函数调用的参数。 IE。这个语句实际上是:
cout ( << a[t] ( << a[++t] ( << a[++t] ) ) ) ;
最里面的短语首先被评估。
当然上面的括号表达式是无效的。为了技术上正确,我应该说:
operator << (operator << ( operator << ( cout, a[++t]), a[++t]), a[t]);
但这令人困惑,因为为了以这种形式编写表达式,我必须颠倒索引运算符的顺序(编译器就是这样做的)。
最后回应 Baum 的评论:即使以这种方式将 this 分解为函数调用也不会使调用确定,因为未指定计算函数参数的顺序,因此它可以在计算之前计算 operator << (cout, a[++t])
a[t]
避免在复杂语句中进行有副作用的操作的解决方案仍然有效。
以下代码给出的输出为:ccb
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++
操作以从右到左的顺序执行,因为必须在调用之前评估每个函数调用的参数。 IE。这个语句实际上是:
cout ( << a[t] ( << a[++t] ( << a[++t] ) ) ) ;
最里面的短语首先被评估。
当然上面的括号表达式是无效的。为了技术上正确,我应该说:
operator << (operator << ( operator << ( cout, a[++t]), a[++t]), a[t]);
但这令人困惑,因为为了以这种形式编写表达式,我必须颠倒索引运算符的顺序(编译器就是这样做的)。
最后回应 Baum 的评论:即使以这种方式将 this 分解为函数调用也不会使调用确定,因为未指定计算函数参数的顺序,因此它可以在计算之前计算 operator << (cout, a[++t])
a[t]
避免在复杂语句中进行有副作用的操作的解决方案仍然有效。