先來看下面這條表示式,它的目的是將ival初始化為6:
int ival=3.541+3; //編譯器可能會警告該運算損失了精度
加法的兩個運算物件型別不同,3.541的型別是double,3的型別是int。c++語言不會直接將兩個不同型別的相加,而是根據型別轉換規則設法將運算物件的型別統一後再求值。上述的型別轉換時自動執行的,無須程式設計師介入,有時候甚至不需要程式設計師了解,因此,我們稱之為隱式轉換。
因為 c++定義了算術型別之間的內建轉換以盡可能防止精度損失,所以這裡3轉換為double型相加得6.451。但是下一步賦值的時候,右運算元進行截斷處理,對此精度會有損失,編譯器也會給出警告。在函式呼叫時也會發生隱式型別轉換,具體的轉換細節可參見本節。
常見隱式轉化
算術轉換
1.對於bool, char,signed char, unsigned char,short, unsigned short等型別來說,它們都有可能通過整型提公升變為int型。如:
a:false提公升成了0,true提公升了為1
b:
3.14159l+『a』;
在這個加法運算中,小寫字母『a』是char型的字元常量,它其實能表示乙個數字值,到底這個數字值是多少完全依賴於機器上的字符集。當把『a』 和乙個long double型別的數相加時,char的值首先被提公升成int,然後int 型別的值再轉化為long double
c: 假如兩個型別分別是 unsigned int 和 int,則int型別的運算物件會轉換為unsigned int
陣列轉換為指標
在大多數用到的陣列表示式中,陣列自動轉換為指向陣列首元素的指標:
int ia[10]; /*含有10個整數的陣列*/
int *ip=ia; /*ia轉換成指向陣列首元素的指標*/
指標的轉換
1.轉換為布林型別
char *cp=get_string();
if(cp) /*... */ //如果cp不為0,則條件為真
while(*cp) //如果*cp不是空字元,則條件為真
2.轉換成常量
int i;
const
int &j=i; //非常量轉換const int的引用
const
int *p=&i; //非常量的位址轉換成常量的位址
int &r=i, *q=p;//錯誤:不允許const轉換為非常量
3.類型別的轉換:
string s;
while(cin>>s)
這裡隱式使用了io標準庫定義的型別轉換,返回的是cin,此處將istream型別的值轉換為bool型別,意味這要檢驗流的狀態,如果讀取成功,返回true,如果失敗,比如說讀取到檔案的末尾,那麼轉換為bool後為false;迴圈條件不成立 C 之型別轉換
一 static cast型別轉換 static cast 應用於c 可以隱式轉換的型別之間,包括雙向隱式轉換和單向隱式轉換。例如 雙向隱式轉換 int a char b a static cast b 可以直接通過隱式轉換,轉換型別 a b b static cast a 可以直接通過隱式轉換,轉...
Effective C 之型別轉換
阿里面試過去好久了,可惜筆試做的太爛了,gg,不過還是要繼續完善自己的知識體系的。這個型別轉換的問題,被面試官問到了,然後一臉尼克楊的蒙蔽表情。其實早就找到了,這個問題,一直因為忙別的,沒有好好總結一下。effective c 條款27 儘量減少轉型動作 c 的設計目標之一是,保證 型別錯誤 絕不可...
More Effective C 之型別轉換
1.條款之優先考慮c 風格的型別轉換 c 通過引用4種新的型別轉換克服了c風格的型別轉換的缺點。這四種操作符是 static cast,const cast,dynamic cast以及reinterpret cast。大多數情況下,關於這些操作符應該知道的是,我們所習慣的寫法為 type expr...