数组中的自增运算符
Increment Operator in arrays C++
以下代码给出的输出如下:
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
相关文章:
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 你能在C++的数组 i,e(+、-、*、/) 中存储算术运算符吗?
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 动态数组的 C++ 重载加运算符
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 为什么我在声明对象数组时不能使用 -> 运算符?
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- 如何将数组的重载运算符 [] 更改为 ()?
- 如何重载逗号运算符以将值分配给数组
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- c++ 使用动态分配运算符反向数组元素
- 重载运算符 [] 用于从对象数组中给出特定索引
- 使用新运算符C++创建多维数组的简单方法
- 重载运算符后打印二维数组<<
- C++ 中动态数组的赋值运算符
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 试图引用已删除函数数组的相等运算符