C語(yǔ)言簡(jiǎn)明講解類型轉(zhuǎn)換的使用與作用
一、類型之間的轉(zhuǎn)換
C語(yǔ)言中的數(shù)據(jù)類型可以進(jìn)行轉(zhuǎn)換
- 強(qiáng)制類型轉(zhuǎn)換
- 隱式類型轉(zhuǎn)換
二、強(qiáng)制類型轉(zhuǎn)換
強(qiáng)制類型轉(zhuǎn)換的語(yǔ)法
- (Type)var_name;
- (Type)value;
強(qiáng)制類型轉(zhuǎn)換的結(jié)果
- 目標(biāo)類型能夠容納目標(biāo)值:結(jié)果不變
- 目標(biāo)類型不能容納目標(biāo)值:結(jié)果將產(chǎn)生截?cái)?/li>
注意:不是所有的強(qiáng)制類型轉(zhuǎn)換都能成功,當(dāng)不能進(jìn)行強(qiáng)制類型轉(zhuǎn)換時(shí),編譯器將產(chǎn)生錯(cuò)誤信息(比如將自定義數(shù)據(jù)類型轉(zhuǎn)換成基本數(shù)據(jù)類型)。
下面看一段強(qiáng)制類型轉(zhuǎn)換的代碼:
#include <stdio.h> struct TS { int i; int j; }; struct TS ts; int main() { short s = 0x1122; char c = (char)s; // 0x22 int i = (int)s; // 0x00001122 int j = (int)3.1415; // 3 unsigned int p = (unsigned int)&ts; //long l = (long)ts; // error //ts = (struct TS)l; // error printf("s = %x\n", s); printf("c = %x\n", c); printf("i = %x\n", i); printf("j = %x\n", j); printf("p = %x\n", p); printf("&ts = %p\n", &ts); return 0; }
下面為輸出結(jié)果:
注意將自定義數(shù)據(jù)類型轉(zhuǎn)換成基本數(shù)據(jù)類型會(huì)報(bào)錯(cuò)。
三、隱式類型轉(zhuǎn)換
隱式類型轉(zhuǎn)換是編譯器主動(dòng)進(jìn)行的類型轉(zhuǎn)換
注意:
低類型到高類型的隱式類型轉(zhuǎn)換是安全的,不會(huì)產(chǎn)生截?cái)?/p>
高類型到低類型的隱式類型轉(zhuǎn)換是不安全的,導(dǎo)致不正確的結(jié)果
四、表達(dá)式中的隱式類型轉(zhuǎn)換
隱式類型轉(zhuǎn)換的發(fā)生點(diǎn)
- 算術(shù)運(yùn)算式中,低類型轉(zhuǎn)換為高類型
- 賦值表達(dá)式中,表達(dá)式的值轉(zhuǎn)換為左邊變量的類型
- 函數(shù)調(diào)用時(shí),實(shí)參轉(zhuǎn)換為形參的類型
- 函數(shù)返回值,return表達(dá)式轉(zhuǎn)換為返回值類型
安全的隱式類型轉(zhuǎn)換:
下面看一段隱式類型轉(zhuǎn)換的代碼:
#include <stdio.h> int main() { char c = 'a'; int i = c; // safe unsigned int j = 0x11223344; short s = j; // unsafe printf("c = %c\n", c); printf("i = %d\n", i); printf("j = %x\n", j); printf("s = %x\n", s); printf("sizeof(c + s) = %d\n", sizeof(c + s)); return 0; }
下面為輸出結(jié)果:
c 為 char 類型,s 為 short 類型,再進(jìn)行四則運(yùn)算前,各個(gè)比 int 窄的加數(shù)自動(dòng)提升為 int,結(jié)果也為 int 類型,故 size 為4
五、小結(jié)
強(qiáng)制類型轉(zhuǎn)換由程序員負(fù)責(zé)完成
- 轉(zhuǎn)換可能產(chǎn)生截?cái)?/li>
- 轉(zhuǎn)換不區(qū)分類型的高低
- 轉(zhuǎn)換不成功時(shí),編譯器給出錯(cuò)誤信息
隱式類型轉(zhuǎn)換由編譯器自動(dòng)完成
- 低類型向高類型的轉(zhuǎn)換是安全的
- 高類型向低類型的轉(zhuǎn)換是不安全的
標(biāo)準(zhǔn)C編譯器的類型檢查是比較寬松的,因此隱式類型轉(zhuǎn)換可能帶來(lái)意外的錯(cuò)誤。
到此這篇關(guān)于C語(yǔ)言簡(jiǎn)明講解類型轉(zhuǎn)換的使用與作用的文章就介紹到這了,更多相關(guān)C語(yǔ)言 類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)單元測(cè)試的示例詳解
單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)單元測(cè)試的方法,需要的可以參考一下2022-09-09C++利用鏈表模板類實(shí)現(xiàn)簡(jiǎn)易隊(duì)列
這篇文章主要為大家詳細(xì)介紹了C++利用鏈表模板類實(shí)現(xiàn)一個(gè)簡(jiǎn)易隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12C語(yǔ)言詳細(xì)講解#error與#line如何使用
這篇文章主要介紹了C語(yǔ)言中#error與#line如何使用,#error與#line雖然在語(yǔ)言里面用的比較少,但是還是有必要了解一下2022-04-04Vscode搭建遠(yuǎn)程c開(kāi)發(fā)環(huán)境的圖文教程
很久沒(méi)有寫C語(yǔ)言了,今天抽空學(xué)習(xí)下C語(yǔ)言知識(shí),接下來(lái)通過(guò)本文給大家介紹Vscode搭建遠(yuǎn)程c開(kāi)發(fā)環(huán)境的詳細(xì)步驟,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-11-11C語(yǔ)言統(tǒng)計(jì)一串字符中空格鍵、Tab鍵、回車鍵、字母、數(shù)字及其他字符的個(gè)數(shù)(Ctrl+Z終止輸入)
這篇文章主要介紹了C語(yǔ)言統(tǒng)計(jì)一串字符中空格鍵、Tab鍵、回車鍵、字母、數(shù)字及其他字符的個(gè)數(shù)(Ctrl+Z終止輸入) ,需要的朋友可以參考下2018-03-03C語(yǔ)言實(shí)現(xiàn)家庭理財(cái)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)家庭理財(cái)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11在vs2017上配置AppGameKit庫(kù)的圖文教程
這篇文章主要介紹了在vs2017上配置AppGameKit庫(kù)的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04