鍍金池/ 教程/ C/ C 強(qiáng)制類(lèi)型轉(zhuǎn)換
C 輸入 & 輸出
C 標(biāo)準(zhǔn)庫(kù) - < signal.h >
C 標(biāo)準(zhǔn)庫(kù)- < string.h >
C 循環(huán)
C 數(shù)據(jù)類(lèi)型
C 字符串
C 標(biāo)準(zhǔn)庫(kù) - < stdarg.h >
C 標(biāo)準(zhǔn)庫(kù) - < math.h >
C 預(yù)處理器
C 存儲(chǔ)類(lèi)
C 標(biāo)準(zhǔn)庫(kù) - < locale.h >
C 指針
C 標(biāo)準(zhǔn)庫(kù) - < assert.h >
C 結(jié)構(gòu)體
C 命令行參數(shù)
C 標(biāo)準(zhǔn)庫(kù) - < ctype.h >
C 強(qiáng)制類(lèi)型轉(zhuǎn)換
C 程序結(jié)構(gòu)
C typedef
C 遞歸
C 運(yùn)算符
C 環(huán)境設(shè)置
C 函數(shù)
C 位域
C 標(biāo)準(zhǔn)庫(kù) - < stddef.h >
C 數(shù)組
C 標(biāo)準(zhǔn)庫(kù) - < errno.h >
C 標(biāo)準(zhǔn)庫(kù) -參考手冊(cè)
C 可變參數(shù)
C 變量
C 錯(cuò)誤處理
C 作用域規(guī)則
C 文件讀寫(xiě)
C 內(nèi)存管理
C 基本語(yǔ)法
C 標(biāo)準(zhǔn)庫(kù) - < stdio.h >
C 標(biāo)準(zhǔn)庫(kù) - < time.h >
C 頭文件
C 判斷
C 標(biāo)準(zhǔn)庫(kù) - < limits.h >
C 共用體
C 標(biāo)準(zhǔn)庫(kù) - < setjmp.h >
C 常量
C 標(biāo)準(zhǔn)庫(kù) - < float.h >
C 簡(jiǎn)介
C 標(biāo)準(zhǔn)庫(kù) - < stdlib.h >

C 強(qiáng)制類(lèi)型轉(zhuǎn)換

強(qiáng)制類(lèi)型轉(zhuǎn)換是把變量從一種類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型。例如,如果您想存儲(chǔ)一個(gè) long 類(lèi)型的值到一個(gè)簡(jiǎn)單的整型中,您需要把 long 類(lèi)型強(qiáng)制轉(zhuǎn)換為 int 類(lèi)型。您可以使用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符來(lái)把值顯式地從一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型,如下所示:

(type_name) expression

請(qǐng)看下面的實(shí)例,使用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符把一個(gè)整數(shù)變量除以另一個(gè)整數(shù)變量,得到一個(gè)浮點(diǎn)數(shù):

#include <stdio.h>

main()
{
   int sum = 17, count = 5;
   double mean;

   mean = (double) sum / count;
   printf("Value of mean : %f\n", mean );

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Value of mean : 3.400000

這里要注意的是強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符的優(yōu)先級(jí)大于除法,因此 sum 的值首先被轉(zhuǎn)換為 double 型,然后除以 count,得到一個(gè)類(lèi)型為 double 的值。

類(lèi)型轉(zhuǎn)換可以是隱式的,由編譯器自動(dòng)執(zhí)行,也可以是顯式的,通過(guò)使用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符來(lái)指定。在編程時(shí),有需要類(lèi)型轉(zhuǎn)換的時(shí)候都用上強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符,是一種良好的編程習(xí)慣。

整數(shù)提升

整數(shù)提升是指把小于 intunsigned int 的整數(shù)類(lèi)型轉(zhuǎn)換為 intunsigned int 的過(guò)程。請(qǐng)看下面的實(shí)例,在 int 中添加一個(gè)字符:

#include <stdio.h>

main()
{
   int  i = 17;
   char c = 'c'; /* ascii 值是 99 */
   int sum;

   sum = i + c;
   printf("Value of sum : %d\n", sum );

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Value of sum : 116

在這里,sum 的值為 116,因?yàn)榫幾g器進(jìn)行了整數(shù)提升,在執(zhí)行實(shí)際加法運(yùn)算時(shí),把 'c' 的值轉(zhuǎn)換為對(duì)應(yīng)的 ascii 值。

常用的算術(shù)轉(zhuǎn)換

常用的算術(shù)轉(zhuǎn)換是隱式地把值強(qiáng)制轉(zhuǎn)換為相同的類(lèi)型。編譯器首先執(zhí)行整數(shù)提升,如果操作數(shù)類(lèi)型不同,則它們會(huì)被轉(zhuǎn)換為下列層次中出現(xiàn)的最高層次的類(lèi)型:

http://wiki.jikexueyuan.com/project/c/images/c-type-casting/usual_arithmetic_conversion.png" alt="Usual Arithmetic Conversion" /> 常用的算術(shù)轉(zhuǎn)換不適用于賦值運(yùn)算符、邏輯運(yùn)算符 && 和 ||。讓我們看看下面的實(shí)例來(lái)理解這個(gè)概念:

#include <stdio.h>

main()
{
   int  i = 17;
   char c = 'c'; /* ascii 值是 99 */
   float sum;

   sum = i + c;
   printf("Value of sum : %f\n", sum );

}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Value of sum : 116.000000

在這里,c 首先被轉(zhuǎn)換為整數(shù),但是由于最后的值是 double 型的,所以會(huì)應(yīng)用常用的算術(shù)轉(zhuǎn)換,編譯器會(huì)把 i 和 c 轉(zhuǎn)換為浮點(diǎn)型,并把它們相加得到一個(gè)浮點(diǎn)數(shù)。