中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

C語言表達(dá)式中的類型隱式轉(zhuǎn)換

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

先看下面一段程序,這段程序摘自《C 專家編程》:

#include <stdio.h>
int array[] = {23,34,12,17,204,99,16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int d=-1,x;
    /*........*/

    if(d <= TOTALTOTAL_ELEMENTS - 2)
        x = array[d+1];
    /*........*/
    return 0;
}

如果是有這樣一段程序的話,你永遠(yuǎn)無法知道x的值到底是多少,因?yàn)檫@句賦值語句x=array[d+1];根本不會(huì)執(zhí)行。原因在哪?經(jīng)過調(diào)試發(fā)現(xiàn)程序執(zhí)行到if語句進(jìn)行判斷完之后,直接跳過下面一條語句的執(zhí)行。下面來分析一下原因,因?yàn)閟izeof求算類型大小時(shí)的返回值是unsigned int類型,而d是signed int,if語句測試兩者大小,d會(huì)自動(dòng)升級為unsigned int,-1轉(zhuǎn)換為unsigned int是一個(gè)很大的正整數(shù),所以表達(dá)式的值永遠(yuǎn)為假,因此后面的賦值語句永遠(yuǎn)不會(huì)執(zhí)行。這里面就是類型轉(zhuǎn)換帶來的bug,如果稍不注意,則可能對整個(gè)工程或者項(xiàng)目造成無法預(yù)測的后果,而這個(gè)bug是很難直接調(diào)試能夠調(diào)試得出來的。

表達(dá)式中的類型轉(zhuǎn)換

類型轉(zhuǎn)化包括強(qiáng)制類型轉(zhuǎn)化和隱式轉(zhuǎn)換,這里所談的都是隱式轉(zhuǎn)換。先來了解一下傳統(tǒng)C(K&R C)中隱式類型轉(zhuǎn)換的規(guī)則:

首先任何char、short int類型的操作數(shù)都會(huì)被轉(zhuǎn)換成int類型,任何float類型都會(huì)被轉(zhuǎn)換為double型。如果一個(gè)操作數(shù)是double型,那么另外一個(gè)操作數(shù)也被轉(zhuǎn)換為double,計(jì)算結(jié)果也是double;如果一個(gè)操作數(shù)是long型,那么另外一個(gè)操作數(shù)也被轉(zhuǎn)換為long型,計(jì)算結(jié)果也是long;如果一個(gè)操作數(shù)是unsigned,那么另外一個(gè)操作數(shù)也被轉(zhuǎn)換為unsigned,計(jì)算結(jié)果為unsigned。

而在新的標(biāo)準(zhǔn)中卻作了一些修改:

1. 整型升級:所有的char,short int和位段都會(huì)首先自動(dòng)轉(zhuǎn)換成int或者unsigned int。如果int能夠表示源類型的所有值,那么就轉(zhuǎn)換為int,否則轉(zhuǎn)換為unsigned int。

2. 在計(jì)算表達(dá)式的值時(shí),通常首先會(huì)將低類型(能夠表示的數(shù)據(jù)范圍小的數(shù)據(jù)類型)轉(zhuǎn)換為高類型,再參與計(jì)算。但是這里要注意的一點(diǎn)是,如果表達(dá)式中存在float型,則不一定會(huì)被轉(zhuǎn)換為double型,然后再進(jìn)行計(jì)算。如有下面這段代碼:

float f1,f2;
double d;
f1 = d*f2;

如果采用單精度進(jìn)行計(jì)算的話,最后結(jié)果同雙精度計(jì)算結(jié)果相同,那么對f2可能不進(jìn)行轉(zhuǎn)換。這一點(diǎn)和傳統(tǒng)C是不同的,但是目前很少有編譯器(VC就不支持)支持這點(diǎn)。

當(dāng)表達(dá)式中存在無符號和有符號類型的操作數(shù)時(shí),如果一個(gè)操作數(shù)是unsigned long int,那么另一個(gè)操作數(shù)也被轉(zhuǎn)換為 unsigned long int;如果一個(gè)操作數(shù)是long int,另一個(gè)操作數(shù)是unsigned int。如果long int能夠表達(dá)unsigned int的表示范圍,則另一個(gè)操作數(shù)被轉(zhuǎn)換為long int;否則兩個(gè)操作數(shù)都被轉(zhuǎn)換為unsigned long int;如果一個(gè)操作數(shù)是unsigned int,另一個(gè)操作數(shù)是int,那么另一個(gè)操作數(shù)被轉(zhuǎn)換為unsigned int。

下面看一個(gè)例子:

假設(shè)int是16位,long int是32位。

那么對于-1L < 1U,因?yàn)?1L是signed long int型的,而1U是unsigned int型,由于signe long int能夠完全表示unsigned int的范圍,所以1U被轉(zhuǎn)換為signed long int;

對于-1L>1UL,因?yàn)?1L是signed long int型的,而1UL是unsigned long int型,則-1L被轉(zhuǎn)換為unsigned long int。

標(biāo)簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Markdown 語法說明手冊

下一篇:Android游戲開發(fā)設(shè)計(jì)步驟