簡體   English   中英

對象指針打印結果順序相反

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM