我寫了這個簡單的 c 程式,得到了一些我不理解的奇怪結果(結果在行注釋中描述)
int arr[3] {1, 2, 3};
int* p{ nullptr };
p = arr;
std::cout << p[0] << " " << p[1] << " " << p[2]; // prints 1 2 3, OK
p = arr;
std::cout << *(p ) << " " << *(p ) << " " << *(p); // prints 2 1 3 ??
p = arr;
std::cout << *p << " " << *( p) << " " << *( p); // prints 3 3 3 ??
p = arr;
std::cout << *p << " "; p;
std::cout << *p << " "; p;
std::cout << *p; // prints 1 2 3, OK
似乎指標沿 std::cout 連接遞增不起作用。我的想法有什么問題?我想它應該起作用了。最好的
最終編輯:我使用的是 c 14,我切換到 c 20,現在它可以正常作業了,謝謝大家!
uj5u.com熱心網友回復:
int* p{ nullptr }; std::cout << p[0] << " " << p[1] << " " << p[2];
這是Undefined Behavior,當您取消參考nullptr時,p它尚未指向有效記憶體。
p = arr; std::cout << p[0] << " " << p[1] << " " << p[2];
這是定義明確的行為。 p指向有效記憶體,總是在取消參考之前遞增,并且以確定性和有效的方式遞增。這與您撰寫以下內容相同:
std::cout << *(p 0) << " " << *(p 1) << " " << *(p 2);
p = arr; std::cout << *(p ) << " " << *(p ) << " " << *(p); p = arr; std::cout << *p << " " << *( p) << " " << *( p);
這兩個都是C 17 之前的未定義行為,因為在早期版本中不保證鏈式operator<<呼叫的評估順序,編譯器可以自由地以它想要的任何順序評估它們。在 C 17 以后不再是這種情況。
p = arr; std::cout << *p << " "; p; std::cout << *p << " "; p; std::cout << *p;
這是定義明確的行為。 p指向有效記憶體,在遞增之前總是被取消參考,并且以確定性和有效的方式遞增。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506514.html
上一篇:當我用指標指向物件時,為什么我沒有讀取類的第一個成員?
下一篇:C函式的雙下劃線指標運算子的用途
