亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言操作符進(jìn)階教程(表達(dá)式求值隱式類型轉(zhuǎn)換方法)

 更新時間:2022年02月16日 11:24:23   作者:喬喬家的龍龍  
這篇文章主要為大家介紹了C語言操作符進(jìn)階教程(表達(dá)式求值隱式類型轉(zhuǎn)換方法)

結(jié)構(gòu)體

結(jié)構(gòu)體變量的聲明需要在主函數(shù)之上或者主函數(shù)中聲明,如果在主函數(shù)之下則會報錯,而且c語言中的結(jié)構(gòu)體不能直接進(jìn)行強(qiáng)制轉(zhuǎn)換,只有結(jié)構(gòu)體指針才能進(jìn)行強(qiáng)制轉(zhuǎn)換。

涉及結(jié)構(gòu)體的操作符這里講兩個:
. (結(jié)構(gòu)體訪問操作符)
-> ()

首先寫一段代碼:

int main()
{
struct Stu s = {"me",19,60};
prinft("%s %d %lf",s.who,s.age,s.weight)
return 0;
}

這就是個結(jié)構(gòu)體訪問,這里的結(jié)構(gòu)是:結(jié)構(gòu)體變量 . 結(jié)構(gòu)體成員,箭頭怎么用呢?當(dāng)我有一個結(jié)構(gòu)體指針:

struct Stu * ps = &s;
printf("%s %d %lf\n"),(*ps).name,(*ps).age,(*ps).score);
return 0;

這里我是對 ps 解引用一下,找到他所指向的對象,其實和上面第一組代碼的結(jié)果是一樣的;但是,橫看豎看都覺得有點啰嗦,我們把格局打開:

printf("%s %d %lf\n",ps->name,ps->age,ps->score);
return 0;

這樣是不是看著要清爽許多?->操作符的基本語法是:結(jié)構(gòu)體指針 -> 結(jié)構(gòu)體成員

表達(dá)式求值

我們在接觸那么多的操作符后,就可以應(yīng)用來進(jìn)行計算,表達(dá)式求值的順序一部分是由操作符的優(yōu)先級和綜合性決定。同樣,有些表達(dá)式的操作數(shù)在求值過程可能需要轉(zhuǎn)換成其他類型。

隱式類型轉(zhuǎn)換

C語言的整型算術(shù)運算總是至少以缺省整型類型的精度來進(jìn)行的。為了獲取這個精度,表達(dá)式中的字符和短整型操作數(shù)在使用之前被轉(zhuǎn)換為普通整型,這種轉(zhuǎn)換被稱為整型提升

意義:

表達(dá)式的整型運算要在CPU的相應(yīng)運算器件內(nèi)執(zhí)行,CPU內(nèi)整型運算器(ALU)的操作數(shù)的字節(jié)長度一般就是int的字節(jié)長度,同時也是CPU的通用寄存器的長度。因此,即使兩個char類型的相加,在CPU執(zhí)行時實際上也要先轉(zhuǎn)換為CPU內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長度。通用CPU(general-purpose CPU)是難以直接實現(xiàn)兩個8比特字節(jié)直接相加運算(雖然機(jī)器指令中可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種長度可能小于int長度的整型值,都必須先轉(zhuǎn)換為int或unsigned int,然后才能送入CPU去執(zhí)行運算。

我們用一段代碼代入一下:

int main()
{
char a = 5;
char b = 126;
char = a+b;
printf("%d\n",c);
return 0;
}

這里的一個表達(dá)式:a+b, 其中a和b的類型都是 char 類型,按照定義來看,也就是這段代碼的運行遠(yuǎn)比我們想象的復(fù)雜 ,我們知道 sizeof(char),sizeof(short)的大小肯定是小于 int 類型的,所以我們計算時就要把char,short提升成 int(unsigned int)類型,再執(zhí)行運算。

方法

整型提升是按照變量的數(shù)據(jù)類型的符號位來提升的,char x = -1 中,x的二進(jìn)制位(補(bǔ)碼)只有8個比特位,char為有符號的char所以整型提升時,高位補(bǔ)充符號位,即為1;無符號整型提升,高位補(bǔ)0。

就拿剛剛的代碼進(jìn)行剖析:

int main()
{
char a = 5; 
//5 = 0000……0101(32位)
//char類型一個字節(jié)8個比特位,就只能從5的二進(jìn)制數(shù)中獲取8位
//即a=00000101
//這一步叫截斷
char b = 126;
//126 = 0000……01111110(32位)
//b = 01111110
char = a+b;
//當(dāng)a,b相加時整型提升
//111111111……0000011
//111111111……0000010
//100000000……1111101(符號位不變,其他位按位取反)=-125
printf("%d\n",c);//
return 0;

下面這個代碼就可以證明整型提升的存在:

int main()
{
char c= 1;
printf("%u\n",sizeof(c));
printf("%u\n",sizeof(+c));
printf("%u\n",sizeof(-c));
return 0;
}

在這里插入圖片描述

從運行結(jié)果來看,為什么會是 4 呢?其實就是因為他參與了運算,進(jìn)行了整型提升,變成了int類型。

算術(shù)轉(zhuǎn)換

我們在剛剛談的是 char 和 short 的計算,那如果是int 和 long ,int 和long long,int 和 float 以及 double計算呢?他們發(fā)生的就是算術(shù)轉(zhuǎn)換??偟膩碚f就是4字節(jié)以下的屬于整型提升,大于4的屬于算術(shù)轉(zhuǎn)換。

是指如果其中操作符的各個操作數(shù)為不同類型,除非其中一個轉(zhuǎn)換成另一個類型,否則無法進(jìn)行操作。下面層次的系統(tǒng)稱為尋常算術(shù)轉(zhuǎn)換

char
short
int
long
long long
float
double

short a = 10;
int b = 5;
prinft("%d\n",sizeof(a+b+1));

printf 結(jié)果是 2 ,是因為short只有兩個字節(jié)大小,在表達(dá)式中 short a 當(dāng)家做主,不管放什么進(jìn)來都是short,但是,sizeof 內(nèi)部多表達(dá)式其實不會真實計算,我們寫文件通常是 test.c,要生成 .exe 的可執(zhí)行文件三步走:編譯,鏈接,運行。在表達(dá)式進(jìn)去在編譯的時候就變成 2 了,根本到不了運行。

如果某個數(shù)類型在上表中排名較低,那會首先轉(zhuǎn)換到另一個操作數(shù)的類型后執(zhí)行運算。
PS.算術(shù)轉(zhuǎn)換要合理,不然會出現(xiàn)潛在問題。
比如把 float 類型變成 int 類型就會造成精度丟失。

操作符屬性

復(fù)雜表達(dá)式的求值有三個影響因素:

1.操作符優(yōu)先級

2.操作符結(jié)合性

3.是否控制求值順序

首先優(yōu)先級是在求值時,相鄰兩個操作符先執(zhí)行哪個的問題,當(dāng)優(yōu)先級相同時,取決于他們的結(jié)合性。

什么是結(jié)合性?舉個栗子: a = b = c;

b的左右兩側(cè)都為 = 號,而 = 具有右結(jié)合性,故應(yīng)該由右向左計算,即:a = (b = c),諸如此類,有表如下(片段):

在這里插入圖片描述

還有一些關(guān)于優(yōu)先級的常見錯誤值得注意一下:

在這里插入圖片描述

有了上面這些屬性是不是任意給一個表達(dá)式就可以確定一個唯一的計算路徑呢?答案是:NO!比如一些問題表達(dá)式:

a*b+c*d+e*f;
a + --a;

第一個可能第一感覺就是三個部分依次先乘后加給扒拉出來,這就想的太簡單了,如果我把 abcdef 換成表達(dá)式,那就可能會相互影響,存在潛在問題。

第二個就不是計算順序的問題了,是取值時機(jī)的問題,左右操作數(shù)相互關(guān)聯(lián)時,計算路徑可能不唯一。

諸君謹(jǐn)記,以上代碼誰寫誰特么就是豬隊友,謹(jǐn)記!

以上就是C語言操作符進(jìn)階教程(表達(dá)式求值隱式類型轉(zhuǎn)換方法)的詳細(xì)內(nèi)容,更多關(guān)于C語言操作符表達(dá)式求值隱式類型轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • N叉樹的三種遍歷(層次遍歷、前序遍歷、后序遍歷)

    N叉樹的三種遍歷(層次遍歷、前序遍歷、后序遍歷)

    本文主要介紹了N叉樹的三種遍歷(層次遍歷、前序遍歷、后序遍歷),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C語言修煉之路悟徹數(shù)組真妙理?巧用下標(biāo)破萬敵下篇

    C語言修煉之路悟徹數(shù)組真妙理?巧用下標(biāo)破萬敵下篇

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • 從匯編看c++中extern關(guān)鍵字的使用

    從匯編看c++中extern關(guān)鍵字的使用

    本篇文章介紹了,在c++中extern關(guān)鍵字的使用概述,需要的朋友參考下
    2013-05-05
  • 用C++實現(xiàn)推箱子小游戲

    用C++實現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了用C++實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 2048小游戲C語言實現(xiàn)代碼

    2048小游戲C語言實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了2048小游戲C語言實現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Qt網(wǎng)絡(luò)編程之TCP通信及常見問題

    Qt網(wǎng)絡(luò)編程之TCP通信及常見問題

    這篇文章主要為大家詳細(xì)介紹了Qt網(wǎng)絡(luò)編程之TCP通信及常見問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 詳解C語言-二級指針三種內(nèi)存模型

    詳解C語言-二級指針三種內(nèi)存模型

    這篇文章主要介紹了詳解C語言-二級指針三種內(nèi)存模型的相關(guān)知識,文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++?命名空間?using聲明使用示例詳解

    C++?命名空間?using聲明使用示例詳解

    這篇文章主要為大家介紹了C++?命名空間?using聲明使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C++利用inotify+epoll實現(xiàn)異步文件監(jiān)控的方法

    C++利用inotify+epoll實現(xiàn)異步文件監(jiān)控的方法

    這篇文章講給大家詳細(xì)介紹一下C++利用inotify+epoll實現(xiàn)異步文件監(jiān)控的方法,inotify是一種異步文件監(jiān)控機(jī)制,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-08-08
  • Qt讀寫ini文件之QSettings用法

    Qt讀寫ini文件之QSettings用法

    這篇文章主要為大家介紹了Qt讀寫ini文件之QSettings的使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評論