对象指针打印结果以相反的顺序进行

Object pointers printing results in reverse order

本文关键字:顺序 指针 打印 结果 对象      更新时间:2023-10-16

我试图使用指针来迭代对象数组。一次打印一个值似乎工作正常,但是当我尝试将它们全部打印在一起时,它以相反的顺序给出结果。

#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;  
} 

第一行发生的情况是编译器将计算包含增量运算符的所有子表达式。评估顺序不是由标准定义的,但可能不在执行方向上。结果,首先计算最后一个子表达式,并将增量转移到第三个第三个表达式,依此类推。