对象指针打印结果以相反的顺序进行
Object pointers printing results in reverse order
我试图使用指针来迭代对象数组。一次打印一个值似乎工作正常,但是当我尝试将它们全部打印在一起时,它以相反的顺序给出结果。
#include<iostream>
using namespace std;
class car{
int tires;
public:
car(int a) {tires = a;};
int GetTires(){return tires;};
};
int main() {
car array[4] = { 2, 4, 6, 8 };
car *p;
p = array;
cout << ((p++)->GetTires()) << " " << ((p++)->GetTires()) << " " << ((p++)->GetTires()) << " " << ((p++)->GetTires()) << endl;
//Prints: 8 6 4 2
p = array;
cout << ((p++)->GetTires()) << " ";
cout << ((p++)->GetTires()) << " ";
cout << ((p++)->GetTires()) << " ";
cout << ((p++)->GetTires()) << " " << endl;
//Prints: 2 4 6 8
return 0;
}
使用 C 函数 'printf' 也给出了相同的输出。谁能解释为什么会发生这种情况?蒂亚。
如果使用早于 C++17 的编译器,则std::cout::operator <<
中(p++)->GetTires()
计算的顺序是不确定的。因此,您的代码会产生未定义的行为。由于另一个计算顺序,另一个编译器或具有其他编译器设置的编译器可能会生成另一个输出。
在上一个和下一个序列点之间,必须访问由表达式计算修改的标量对象的前一个值,以确定要存储的值。如果以任何其他方式访问它,则行为是未定义的。
cout << i << i++; // undefined behavior (until C++17) a[i] = i++; // undefined behavior (until C++17)
推荐阅读:C++17引入的评估顺序保证是什么?
代码
cout << ((p++)->GetTires()) << " " << ((p++)->GetTires()) << " " << ((p++)->GetTires()) << " " << ((p++)->GetTires()) << endl;
不执行与 相同
cout << ((p++)->GetTires()) << " ";
cout << ((p++)->GetTires()) << " ";
cout << ((p++)->GetTires()) << " ";
cout << ((p++)->GetTires()) << " " << endl;
这就是典型的操作员<<的样子
ostream& operator<<(ostream& os, const Type& dt)
{
os << dt.value;
return os;
}
第一行发生的情况是编译器将计算包含增量运算符的所有子表达式。评估顺序不是由标准定义的,但可能不在执行方向上。结果,首先计算最后一个子表达式,并将增量转移到第三个第三个表达式,依此类推。
相关文章:
- 优先顺序:智能指针和类析构函数
- C++17 中函数指针的求值顺序
- 对象指针打印结果以相反的顺序进行
- C++中的结构是否按顺序分配内存?每次都以某种方式获得指针比较的正确答案
- 将字符指针按顺序存储在 map 中 std::map<char*, int> mymap。将其存储为字符或字符串不是一个选项
- 共享指针析构函数中的内存顺序
- 使用指针数组按字母顺序排序
- 带有矢量切片的矢量指针,用于从预序和顺序向量生成树
- SEG故障取决于指针分配的顺序
- "Moving"指向指针的顺序容器
- 关于使用共享指针的评估顺序
- 如何使用 std::shuffle 以随机顺序对具有唯一指针的向量进行洗牌
- C 按顺序排列一个指针阵列
- 为什么指针类型的内置关系运算符不生成C++的总顺序?
- 指针集中元素的顺序
- 允许智能指针按特定顺序删除 SDL 组件
- C++中的指针和引用变量语法顺序
- 如果类实现多个接口,VTable 的方法指针顺序是什么?
- 函数指针和DLL加载顺序
- 新的表达式求值顺序(指针赋值)