2014-08-31 71 views
0

我正在研究C++語言,本書的一個建議是不要混合表達式簽名和無符號類型,因爲簽名類型將轉換爲無符號類型。在C++中涉及簽名和未簽名類型的表達式

例如:

unsigned int u = 10; 
int a = 42; 
std::cout << u - a << std::endl; // here the value will wraps around 

這個程序後,如果我嘗試ceck的類型與typeid的結果爲int,爲什麼呢? 爲什麼a的類型不是更多的無符號,但它返回到int?

+1

不,這本書意味着你的最後一行等同於'std :: cout << u - (unsigned int)a << std :: endl;'。 – 2014-08-31 08:42:25

回答

3

該變量未轉換爲無符號。它的值被轉換爲無符號用於表達式中。也就是說,當你這樣做:

std::cout << u - a << std::endl; 

臨時,無名無符號整型從a,然後從u減去創建。這是因爲如果你做了這一點:

std::cout << u - (unsigned int)a << std::endl; 

或本:

unsigned int __nameless__ = a; 
std::cout << u - __nameless__ << std::endl; 

除將__nameless__變量實際上並不存在的表達之外。

+0

每當我評估一個表達式或只有在需要執行類型轉換時纔會創建一個臨時對象? – 2014-08-31 09:09:05

+0

@ user3697275:爲任何不僅僅返回對現有對象的引用的表達式創建臨時對象。類型轉換是這些表達式之一,減法本身也是。所以,'u - a'實際上有兩個臨時對象。 (1)將'a'轉換爲'unsigned int'的結果,以及(2)從'u'中減去臨時結果。 – 2014-08-31 09:23:36

+0

如果變量a的值爲-42,會發生什麼情況?編譯器創建一個具有負值的無符號類型臨時文件會發生什麼? – 2014-09-01 09:00:16

0

變量的類型不變;當評估表達式時,子表達式可以被轉換或強制爲不同的類型。因此,在示例u - a中,右側的子表達式被轉換爲與左側的子表達式的類型匹配,但是從概念上講,這是一個不可見的中間結果,它是這種其他類型的結果,而不是被更改的原始基礎變量。