[英]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'也可以提供相同的輸出。 任何人都可以解釋為什么會這樣嗎? TIA。
如果使用的是早於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;
}
第一行中發生的是編譯器將評估包含增量運算符的所有子表達式。 評估順序不是由標准定義的,但可能不是執行方向。 在結果中,首先評估最后一個子表達式,並將增量轉移到第三個表達式,依此類推。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.