為什么增加size_t默認值會給出垃圾值?
#include <iostream>
using namespace std;
struct Test {
size_t a;
size_t b;
};
int main() {
Test wrong;
cout << (wrong.a) ;
cout << endl;
cout << (wrong.b) ;
cout << endl;
Test right {};
cout << (right.a) ;
cout << endl;
cout << (right.b) ;
return 0;
}
對于上面的代碼獲取輸出
Output:
93937114642880
93937114642304
0
0
這是因為size_t不是 POD 嗎?另外為什么不Test wrong;呼叫默認建構式并將欄位初始化為默認值?
uj5u.com熱心網友回復:
為什么增加
size_t默認值會給出垃圾值?
你需要非常小心你的術語。default在 C 中具有特定含義。
在您的第一種情況下,size_t變數中的變數wrong沒有被賦予默認值。您正在遞增具有不確定值的未初始化變數。這是未定義的行為。因此,您會得到垃圾輸出,因為您一開始就在處理垃圾值。
在第二種情況下,您將變數值初始化為to然后再遞增它們,這是明確定義的行為。并且由于您使用的是后增量運算子,它在遞增之前回傳前一個值,這就是為什么輸出是而不是.size_tright0 01
這是因為
size_t不是 POD 嗎?
No. size_t是 POD 型別。
另外為什么不
Test wrong;呼叫默認建構式并將欄位初始化為默認值?
Test wrong;執行默認初始化。它確實呼叫了默認建構式,但是您根本沒有自己實作該建構式,因此編譯器會為您自動生成一個。而且由于所有成員都是 POD,生成的建構式沒有什么可做的,所以它根本不初始化成員。
Test right{};執行值初始化,在這種情況下會將size_t成員清零。
uj5u.com熱心網友回復:
之后讀取struct成員的行為Test wrong;是未定義的。這是因為它們沒有被初始化。因此,它們具有不確定的值。 需要讀取正在遞增的物件;(wrong.a) ;到達的第一個未定義陳述句也是如此。形式上這意味著整個程式的行為是未定義的!
Test right{}; 是否對成員進行值初始化,這具有將它們設定為零的效果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/421205.html
標籤:
上一篇:當send()在TCPC套接字中只發送一次時,recv()會讀取多次。難道我做錯了什么?我可以同步套接字通信嗎?
