成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

這些c語言操作符你確定你掌握了?如果不保準(zhǔn)就來看看這篇文章吧

Carson / 2899人閱讀

摘要:毋庸置疑,運(yùn)算符號(hào)操作符就是進(jìn)行語言的一些運(yùn)算的,這些運(yùn)算符雖然你在學(xué)語言的時(shí)候很不起眼,而在有些題目上還不讓用這些操作符來做題,但是,當(dāng)你用到他們的時(shí)候,他們會(huì)給你意想不到的幫助。

目錄

操作符詳解

什么是操作符呢?

操作符的分類

操作符的優(yōu)先級(jí)

?1、優(yōu)先級(jí)1級(jí)

2、優(yōu)先級(jí)2級(jí)

3、優(yōu)先級(jí)3級(jí)

4、優(yōu)先級(jí)4級(jí)

5、優(yōu)先級(jí)5級(jí)

6、優(yōu)先級(jí)6級(jí)

7、優(yōu)先級(jí)7級(jí)

8、優(yōu)先級(jí)8級(jí)

9、優(yōu)先級(jí)9級(jí)

10、優(yōu)先級(jí)10級(jí)

11、優(yōu)先級(jí)11級(jí)

12、優(yōu)先級(jí)12級(jí)

13、優(yōu)先級(jí)13級(jí)

14、優(yōu)先級(jí)14級(jí)

15、優(yōu)先級(jí)15級(jí)

算術(shù)操作符

移位操作符

右移操作符>>

位操作符

?應(yīng)用舉例

單目操作符

sizeof和數(shù)組

關(guān)系操作符

邏輯操作符

邏輯判斷一道筆試題

條件操作符

逗號(hào)表達(dá)式

下標(biāo)引用操作符

?函數(shù)調(diào)用操作符

?結(jié)構(gòu)體成員訪問操作符

表達(dá)式求值

隱式類型轉(zhuǎn)換

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


操作符詳解

什么是操作符呢?

C語言操作符指的是運(yùn)算符號(hào)。毋庸置疑,運(yùn)算符號(hào)(操作符)就是進(jìn)行c語言的一些運(yùn)算的,這些運(yùn)算符雖然你在學(xué)c語言的時(shí)候很不起眼,而在有些題目上還不讓用這些操作符來做題,但是,當(dāng)你用到他們的時(shí)候,他們會(huì)給你意想不到的幫助。

操作符的分類

C語言中的符號(hào)分為10類:算術(shù)運(yùn)算符關(guān)系運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號(hào)運(yùn)算符指針運(yùn)算符、求字節(jié)數(shù)運(yùn)算符和特殊運(yùn)算符

操作符的優(yōu)先級(jí)

所謂優(yōu)先級(jí):就是計(jì)算的順序,在數(shù)學(xué)中有這么一個(gè)說法,就是先計(jì)算括號(hào)里面的,在計(jì)算外面的,先計(jì)算乘法除法,在計(jì)算加法減法。

優(yōu)先級(jí)順序:(這里的優(yōu)先順序估計(jì)一般人是記不住的,這些都是在百度上搜索的,大家可以當(dāng)做筆記或者字典來看,找到自己不會(huì)的點(diǎn)學(xué)就完了)。

?1、優(yōu)先級(jí)1級(jí)

結(jié)合方向 左結(jié)合(自左至右)

( ) 圓括號(hào)

[ ]?[1]
?
下標(biāo)運(yùn)算符

-> 指向結(jié)構(gòu)體成員運(yùn)算符

. 結(jié)構(gòu)體成員運(yùn)算符?[1]?(請注意它是一個(gè)實(shí)心圓點(diǎn))


2、優(yōu)先級(jí)2級(jí)

結(jié)合方向 右結(jié)合(自右至左)單目運(yùn)算符

! 邏輯非運(yùn)算符

~ 按位取反運(yùn)算符

++ 自增運(yùn)算符

-- 自減運(yùn)算符

-?負(fù)號(hào)運(yùn)算符

(類型) 類型轉(zhuǎn)換運(yùn)算符

* 指針運(yùn)算符

& 地址與運(yùn)算符

sizeof 長度運(yùn)算符


3、優(yōu)先級(jí)3級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

* 乘法運(yùn)算符

/ 除法運(yùn)算符

% 取余運(yùn)算符


4、優(yōu)先級(jí)4級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

+ 加法運(yùn)算符

- 減法運(yùn)算符


5、優(yōu)先級(jí)5級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

<< 左移運(yùn)算符

>> 右移運(yùn)算符


6、優(yōu)先級(jí)6級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

<、<=、>、>= 關(guān)系運(yùn)算符


7、優(yōu)先級(jí)7級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

== 等于運(yùn)算符 (判斷)

!= 不等于運(yùn)算符(判斷)


8、優(yōu)先級(jí)8級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

& 按位與運(yùn)算符


9、優(yōu)先級(jí)9級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

^ 按位異或運(yùn)算符


10、優(yōu)先級(jí)10級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

| 按位或運(yùn)算符 舉例:0xfe|0xef 即為1111 1110 與1110 1111按位或運(yùn)算則答案為:1111 1111 即0xff。


11、優(yōu)先級(jí)11級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

&& 邏輯與運(yùn)算符


12、優(yōu)先級(jí)12級(jí)

結(jié)合方向 左結(jié)合 雙目運(yùn)算符

|| 邏輯或運(yùn)算符


13、優(yōu)先級(jí)13級(jí)

結(jié)合方向 右結(jié)合 三目運(yùn)算符

? :?條件運(yùn)算符




14、優(yōu)先級(jí)14級(jí)

結(jié)合方向 右結(jié)合 雙目運(yùn)算符

=?賦值運(yùn)算符

+ = 加后賦值運(yùn)算符 如s+=1表示s=s+1

- = 減后賦值運(yùn)算符 如s-=1表示s=s-1

* = 乘后賦值運(yùn)算符

/ = 除后賦值運(yùn)算符

% = 取模后賦值運(yùn)算符

< <= 左移后賦值運(yùn)算符

>>=右移后賦值運(yùn)算符

&= 按位與后賦值運(yùn)算符

^=按位異或后賦值運(yùn)算符

|= 按位或后賦值運(yùn)算符


15、優(yōu)先級(jí)15級(jí)

結(jié)合方向 左結(jié)合

,?逗號(hào)運(yùn)算符

算術(shù)操作符

+? (進(jìn)行加法運(yùn)算)???-(進(jìn)行減法運(yùn)算)? ? ? ?*(在c語言中*代表是乘法)

/(在c語言中/代表除法):

對于除法運(yùn)算,如果兩個(gè)數(shù)都是整數(shù)的話(即整數(shù)除法),則結(jié)果為整數(shù),如果兩個(gè)數(shù)有一個(gè)數(shù)為浮點(diǎn)數(shù),則結(jié)果就為小數(shù)

#includeint main(){	int a1 = 10 / 2;	float a2 = 10 / 2.0;	printf("%d/n", a1);	printf("%f", a2);	return 0;}

%(在C語言中不是百分號(hào)這個(gè)是取模操作符)

取模操作符計(jì)算的是整數(shù)不能是小數(shù),其中結(jié)果為余數(shù)。

移位操作符

移位操作符:移位是某數(shù)在內(nèi)存中存儲(chǔ)的二進(jìn)制位。

分類:左移操作符<>

左移操作符<<

左移操作符是將數(shù)字在內(nèi)存中存儲(chǔ)的二進(jìn)制位向左移位。

先給大家講講進(jìn)制吧

進(jìn)制也就是進(jìn)位計(jì)數(shù)制,是人為定義的帶進(jìn)位的計(jì)數(shù)方法(有不帶進(jìn)位的計(jì)數(shù)方法,比如原始的結(jié)繩計(jì)數(shù)法,唱票時(shí)常用的“正”字計(jì)數(shù)法,以及類似的tally mark計(jì)數(shù))。 對于任何一種進(jìn)制---X進(jìn)制,就表示每一位上的數(shù)運(yùn)算時(shí)都是逢X進(jìn)一位。?十進(jìn)制是逢十進(jìn)一,十六進(jìn)制是逢十六進(jìn)一,二進(jìn)制就是逢二進(jìn)一,以此類推,x進(jìn)制就是逢x進(jìn)位。

進(jìn)制的分類

16進(jìn)制(0~15)? ? ? 8進(jìn)制(0~7)? ? ? ? ? 2進(jìn)制(0~1)

進(jìn)制的表示形式:二進(jìn)制以0b開頭,八進(jìn)制以0開頭,16進(jìn)制以0x開頭

由于在計(jì)算機(jī)存儲(chǔ)的是二進(jìn)制我們具體給大家講二進(jìn)制其他進(jìn)制可以類比

由于二進(jìn)制只有0和1,逢2進(jìn)一,從右面開始,右面第一位是2^0,第二位是2^1,依次類推

?那我們拿5來舉例 5就是(前面的0省略),101(4+0+1=5);

這樣也就會(huì)了。

好接著我們來講左移操作符

還是拿5來舉例

?所以顯然左移操作符的作用是向左移動(dòng)二進(jìn)制位左邊丟棄右邊補(bǔ)0

用代碼這么表示? ? int a= a <<1;

那我們在進(jìn)行移位操作的時(shí)候a本身有沒有變呢???

int main(){	int a = 5;	int b = a << 1;	printf("%d/n", a);	printf("%d/n", b);	return 0;}

?顯然a本身沒有變因?yàn)樽笠浦皇且环N運(yùn)算操作不會(huì)改變其地址;

講右移操作符之前先給大家普及一個(gè)小知識(shí),我們整數(shù)在內(nèi)存中存儲(chǔ)都是補(bǔ)碼,那什么是補(bǔ)碼呢??

說補(bǔ)碼那就不得不說原碼和反碼

原碼是啥呢?原碼就是一個(gè)整數(shù)本身的二進(jìn)制 ,比如5的原碼就是101,又由于正數(shù)的原碼補(bǔ)碼反碼都相同所以補(bǔ)碼也是101。

先說一下從原碼到補(bǔ)碼的運(yùn)算過程——是這樣運(yùn)算的原碼——>反碼——>補(bǔ)碼

原碼變反碼是符號(hào)位不變剩下的所有位按位取反(0變1,1變0),反碼變補(bǔ)碼是反碼+1就是補(bǔ)碼。

右移操作符>>

所謂右移操作符就是二進(jìn)制位向右移位

右移操作符分為兩種運(yùn)算,一種是算術(shù)右移,第二種是邏輯右移,具體哪種運(yùn)算就取決于編譯器進(jìn)行哪種運(yùn)算了(vs編譯器采用的是算術(shù)右移)

算術(shù)右移:右邊丟棄,左邊額補(bǔ)原來的符號(hào)位

邏輯右移:右邊丟棄,左邊補(bǔ)0

需要注意的是正數(shù)的原碼補(bǔ)碼反碼相同,而負(fù)數(shù)的原碼補(bǔ)碼反碼需要計(jì)算,因?yàn)橥ǔT趦?nèi)存中存儲(chǔ)的是二進(jìn)制補(bǔ)碼,而在打印的時(shí)候或者使用的時(shí)候我們用的是原碼,這時(shí)候,我們就需要將補(bǔ)碼變成原碼,怎么變呢??那當(dāng)時(shí)剛才的反過來,補(bǔ)碼變反碼,那就是二進(jìn)制位減一,反碼變原碼符號(hào)位不變其他位按位取反。

當(dāng)我們進(jìn)行左移或者右移的時(shí)候一定先轉(zhuǎn)化為原來二進(jìn)制的補(bǔ)碼在進(jìn)行移位操作

給大家舉個(gè)例子

位操作符

位操作符有&(按位與)|(按位或)^(按位異或)

按位與:我是這么理解的,比如我與你肯定是你和我必須都存在,所以只有兩個(gè)都為1時(shí)才為1

按位或:或就是只要有一個(gè)就行,也就是兩個(gè)當(dāng)中有1個(gè)為1才為1

按位異或:相同為0,相異為1

?應(yīng)用舉例

交換兩個(gè)數(shù)(不允許創(chuàng)作臨時(shí)變量)

我們都知道有這些操作符但都不知道該怎么應(yīng)用,接下來我們進(jìn)行按位異或的應(yīng)用

首先先提個(gè)問題b^b=多少呢??

^(按位異或是相同為0相異為1),那可知b^b就應(yīng)該是0了,那下面的代碼你就應(yīng)該可以理解了

#include int main(){ int a = 10; int b = 20; a = a^b; b = a^b; a = a^b; printf("a = %d b = %d/n", a, b); return 0;}

這里的b=a^b^b就是b=a;而a=a^a^b(就是a=b)。

賦值操作符

賦值就是把一個(gè)變量變成你想要的結(jié)果

我們通常用的賦值號(hào)就是=(值得注意的是==是相等,=是賦值)

復(fù)合賦值符+= -= *= /= %= >>= <<= &= |= ^=

但賦值時(shí)左值必須是一塊空間比如int

右值是一個(gè)值或者一塊空間的內(nèi)容

注意:當(dāng)我們用復(fù)合賦值符的時(shí)候盡量不要寫成連等例如y=b+2=c,這樣就讓人看不懂你的代碼可讀性就大大降低,所以我們寫代碼一定寫著清晰明了,讓別人看代碼一目了然。

單目操作符

! ? ? ? ? ? 邏輯反操作

什么是邏輯反操作?

反操作其實(shí)就是把真的改成假的,假的改成真的

#includeint main(){	int flag = 1;//1代表真	if (!flag)//!flag就代表假	{		printf("1/n");	}	else	{		printf("2/n");	}	return 0;}

- ? ? ? ? ? 負(fù)值

+ ? ? ? ? ? 正值

這里的正負(fù)值就是我們說的正負(fù)號(hào)也不用多說,因?yàn)檫@里是單目操作符,所以不要理解為加號(hào)和減號(hào),比如加號(hào)兩邊是有兩個(gè)操作數(shù)所以是雙目操作符。

& ? ? ? ? ? 取地址

取地址符號(hào)就是取出變量的地址

#includeint main(){	int a = 10;	//int* p = &a;//這里存放地址的變量叫做指針變量,其中int*是類型	printf("%p/n", &a);//取出a變量的地址	return 0;}

sizeof ? ? ?操作數(shù)的類型長度(以字節(jié)為單位)

sizeof用來求數(shù)據(jù)類型或者變量的大小

#includeint main(){	int a = 2;	printf("%d/n", sizeof(a));//計(jì)算變量a的大小	printf("%d/n", sizeof(int));//計(jì)算int類型的大小必須加()	printf("%d/n", sizeof a);//計(jì)算變量a的大小	printf("%d/n", sizeof int);//計(jì)算int類型的大小必須加(),這里就會(huì)報(bào)錯(cuò)	return 0;}

~ ? ? ? ? ? 對一個(gè)數(shù)的二進(jìn)制按位取反

#includeint main(){	//按位取反  ~	//比如5 	//5 的二進(jìn)制位 00000000000000000000000000000101	// 按位取反    11111111111111111111111111111010	int a = 5;	printf("%d/n", ~a);	return 0;}

前置--:先--在使用

#includeint main(){	//前置--先--在使用	int a = 10;	int b = --a;	printf("%d/n", a);	printf("%d/n", b);	return 0;}

?

結(jié)果為啥是9 9呢?

我們這里是這樣操作的, 先--(就是a先--所以a變成9),在使用(把a(bǔ)=9賦給b);

后置--

#includeint main(){	//后置--先使用在--	int a = 10;	int b = a--;	printf("%d/n", a);	printf("%d/n", b);	return 0;}

?先使用(先把a(bǔ)=10賦給b所以b=10),在--(a--變成a=9);

前置++

#includeint main(){	//前置++先++在使用	int a = 10;	int b = ++a;	printf("%d/n", a);	printf("%d/n", b);	return 0;}

?先++(a先自己增加1所以a=11),在使用(把a(bǔ)=11賦給b,所以b=11);

后置++

#includeint main(){	//z后置++先使用在++	int a = 10;	int b = a++;	printf("%d/n", a);	printf("%d/n", b);	return 0;}

先使用(先將a=10賦給b,所以b=10),在++(a自己增加1,所以a=11)。

++,--總結(jié):

如果是前置就先給自己增加或者減少,在賦值,如果是后置先把原來的值賦值在進(jìn)行++或者--;

* ? ? ? ? ? 間接訪問操作符(解引用操作符)

#includeint main(){	int a = 10;	int *p = &a;//指針變量p取出a的地址	*p = 20;//*p就是把存放a的地址解引用了,這里的*p就是原來的a,            //這里是間接訪問把原來的a=10改成20	return 0;}

(類型) ? ? ? 強(qiáng)制類型轉(zhuǎn)換

強(qiáng)制類型轉(zhuǎn)換就是把原本你不是這個(gè)常量屬于的類型,強(qiáng)制轉(zhuǎn)成某個(gè)類型

#includeint main(){	int a = (int)3.14;//把原本屬于double類型的強(qiáng)制轉(zhuǎn)換成int類型	printf("%d/n", a);	//在比如隨機(jī)數(shù)種子	//srand((unsigned int)time(NULL));	return 0;}

sizeof和數(shù)組

這個(gè)我們前面也講過了,這里在復(fù)習(xí)下

我們講了有兩種特殊情況一種是sizeof(arr)計(jì)算的是整個(gè)數(shù)組的大小,一種是&arr指的的是整個(gè)數(shù)組的大小,剩下的都指的是數(shù)組首元素的地址。

#includeint main(){	int arr[5] = { 0,1,2,3,4 };	printf("%d/n", sizeof(arr));	return 0;}

當(dāng)我們傳參的時(shí)候

#include void test1(int arr[]){	printf("%d/n", sizeof(arr));//數(shù)組傳參,大小為指針的大小為4}void test2(char ch[]){	printf("%d/n", sizeof(ch));//數(shù)組傳參,大小為指針的大小為4}int main(){	int arr[10] = { 0 };	char ch[10] = { 0 };	printf("%d/n", sizeof(arr));//計(jì)算的是整個(gè)數(shù)組大小為10*4	printf("%d/n", sizeof(ch));//計(jì)算的是真?zhèn)€字符數(shù)組的大小為10*1	test1(arr);	test2(ch);	return 0;}

當(dāng)我們進(jìn)行數(shù)組傳參的時(shí)候傳的是地址也就是指針?biāo)源笮?個(gè)字節(jié)

還要注意當(dāng)我們想要計(jì)算整個(gè)數(shù)組大小的時(shí)候一定要main函數(shù)內(nèi)部計(jì)算

關(guān)系操作符

>
>=
<
<=
!= ? 用于測試“不相等”
== ? ? ?用于測試“相等(經(jīng)常在判斷時(shí)候使用,一定要和=(賦值號(hào))區(qū)分開)。

邏輯操作符

&& ? ? 邏輯與 ? ? ? ? ? ? ? || ? ? ?邏輯或

這兩雖然是與前面按位與&,按位或|,意思相同

兩者區(qū)別是按位與和按位或是與二進(jìn)制的計(jì)算有關(guān)

而邏輯與和邏輯或是進(jìn)行判斷的

舉個(gè)例子

#includeint main(){	//判斷一個(gè)人的年齡處于什么狀態(tài)	int age = 0;	scanf("%d", &age);	if (0 < age < 18)	{		printf("未成年/n");	}	else	{		printf("成年/n");	}	return 0;}

這個(gè)代碼對么????

根據(jù)輸出結(jié)果判斷這個(gè)代碼肯定是錯(cuò)的,那這里為啥會(huì)錯(cuò)呢?這不應(yīng)該和數(shù)學(xué)上是一樣的么?

在這個(gè)代碼是這樣理解的,你輸入25,進(jìn)入if語句就判斷左半部分0<25結(jié)果為真,又25>18結(jié)果為真,所以判斷為真,輸出未成年。

那我們怎樣才能正確表示呢?這時(shí)邏輯操作符就派上用場了

#includeint main(){	//判斷一個(gè)人的年齡處于什么狀態(tài)	int age = 0;	scanf("%d", &age);	if (age>=0&&age<=18)	{		printf("未成年/n");	}	else	{		printf("成年/n");	}	return 0;}

邏輯判斷一道筆試題

#include int main(){    int i = 0, a = 0, b = 2, c = 3, d = 4;    i = a++ && ++b && d++;    printf("a = %d/n b = %d/n c = %d/nd = %d/n", a, b, c, d);    return 0;}//程序輸出的結(jié)果是什么

這個(gè)題如何考慮呢?

首先i=a++(后置++,先使用后++),這里先使用a=0&&++b為假所以++b不在計(jì)算,又0&&d++為假不計(jì)算,在打印的時(shí)候a在使用a++(a=1),其他的不計(jì)算所以計(jì)算結(jié)果為1234.

?

#include int main(){    int i = 0, a = 0, b = 2, c = 3, d = 4;    i = a++||++b||d++;    printf("a = %d/n b = %d/n c = %d/nd = %d/n", a, b, c, d);    return 0;}//程序輸出的結(jié)果是什么

這回我們把i換了,這回結(jié)果又是什么呢

首先a++,a不變,這時(shí)候變?yōu)閍或什么,0||++b,結(jié)果為真所以b=3,c不變,前面是真,真或上啥都為真,d++不計(jì)算,最后打印a使用(a=1),所以結(jié)果我1334.

條件操作符

exp1 ? exp2 : exp3? ?解釋:表達(dá)式一成立則執(zhí)行表達(dá)式二,輸出表達(dá)式二結(jié)果,不成立執(zhí)行表達(dá)式三,輸出表達(dá)式三結(jié)果。

#includeint main(){	//舉例判斷兩個(gè)數(shù)的大小然后輸出大的數(shù)	int a = 10;	int b = 20;	/*if (a > b)	{		printf("%d/n", a);	}	else	{		printf("%d/n", b);	}*/	//利用條件操作符	int ret = (a > b ? a : b);//a>b成立執(zhí)行a,不成立則執(zhí)行b。	printf("%d/n", ret);	return 0;}

逗號(hào)表達(dá)式

exp1, exp2, exp3, …expN

逗號(hào)表達(dá)式,就是用逗號(hào)隔開的多個(gè)表達(dá)式。

逗號(hào)表達(dá)式,從左向右依次執(zhí)行。整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果。

?逗號(hào)表達(dá)式雖然執(zhí)行表達(dá)式最后的結(jié)果但前面兩個(gè)表達(dá)式也是缺一不可的,前面兩個(gè)表達(dá)式要進(jìn)行運(yùn)算操作。

下標(biāo)引用操作符

下標(biāo)引用操作符常用于數(shù)組

?函數(shù)調(diào)用操作符

?結(jié)構(gòu)體成員訪問操作符

#includeint main(){	//創(chuàng)建一個(gè)結(jié)構(gòu)體變量	//以一個(gè)學(xué)生為例	struct stu	{		int height;//身高		int weight;//體重	};	struct stu stu = {180,120};	struct stu* ps = &stu;	//printf("身高:%d/n體重:%d", s.height, s.weight);//.操作符為結(jié)構(gòu)體成員訪問操作符	printf("身高:%d/n體重:%d/n", (*ps).height, (*ps).weight);//結(jié)構(gòu)體指針訪問結(jié)構(gòu)體成員	printf("身高:%d/n體重:%d", ps->height, ps->weight);// 結(jié)構(gòu)體指針->結(jié)構(gòu)體成員名	return 0;}

總結(jié):結(jié)構(gòu)體訪問

結(jié)構(gòu)體.結(jié)構(gòu)體成員名

結(jié)構(gòu)體指針->結(jié)構(gòu)體成員

表達(dá)式求值

表達(dá)式求值的定義:表達(dá)式求值的順序一部分是由操作符的優(yōu)先級(jí)和結(jié)合性決定。 同樣,有些表達(dá)式的操作數(shù)在求值的過程中可能需要轉(zhuǎn)換為其他類型。

隱式類型轉(zhuǎn)換

整形提升

什么是整形提升呢?

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

當(dāng)我們進(jìn)行比較低的類型進(jìn)行計(jì)算的時(shí)候,由于計(jì)算機(jī)無法實(shí)現(xiàn)這種低的類型計(jì)算,計(jì)算機(jī)常常把類型轉(zhuǎn)換成整形進(jìn)行計(jì)算

我們來舉幾個(gè)例子

比如我們要進(jìn)行char和char類型的計(jì)算

#includeint main(){	char a = 5;	//a的二進(jìn)制	//00000000000000000000000000000101	//由于char類型是一個(gè)字節(jié)只能存放8個(gè)比特位所以需要截?cái)?//00000101	char b = 126;	//00000000000000000000000001111110	//char類型進(jìn)行截?cái)?//01111110	char c = a + b;	//當(dāng)我們進(jìn)行a+b時(shí)候由于計(jì)算機(jī)無法實(shí)現(xiàn)char類型的計(jì)算	//這時(shí)我們就需要進(jìn)行整形提升	//那怎樣整形提升呢??	//整形提升是按照變量的數(shù)據(jù)類型的符號(hào)位來提升	//所以我們補(bǔ)符號(hào)位	//a為00000000000000000000000000000101	//b為00000000000000000000000001111110	//兩者相加	//c變成10000011	//當(dāng)我們進(jìn)行打印的時(shí)候繼續(xù)整形提升	//整形提升后	//1111111111111111111111110000011--補(bǔ)碼	//又因?yàn)樵趦?nèi)存中存儲(chǔ)的是補(bǔ)碼而我們要的是原碼	//1111111111111111111111110000010--反碼	//1000000000000000000000001111101原碼	printf("%d/n", c);	return 0;}

我們再舉個(gè)例子

int main(){ char a = 0xb6; short b = 0xb600; int c = 0xb6000000; if(a==0xb6) printf("a"); if(b==0xb600) printf("b"); if(c==0xb6000000) printf("c"); return 0;}

?

這個(gè)例子就很明顯由于a和b都需要整形提升所以不可能是原來的值,而c就可以打印?

舉例

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

?這個(gè)也會(huì)很好的能說明當(dāng)?shù)皖愋偷倪M(jìn)行計(jì)算的時(shí)候(表達(dá)式計(jì)算時(shí))也需要整形提升。

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

如果某個(gè)操作符的各個(gè)操作數(shù)屬于不同的類型,那么除非其中一個(gè)操作數(shù)的轉(zhuǎn)換為另一個(gè)操作數(shù)的類 型,否則操作就無法進(jìn)行。下面的層次體系稱為尋常算術(shù)轉(zhuǎn)換。

這個(gè)算術(shù)轉(zhuǎn)換適用于int類型以上的類型進(jìn)行轉(zhuǎn)換

long double

double

float

unsigned long int

long int

unsigned int

int

一般由低向高轉(zhuǎn)換

舉例

#includeint main(){	float f = 3.14;	int num = f;//隱式轉(zhuǎn)換,會(huì)有精度丟失}

像這種如果要進(jìn)行計(jì)算的話int類型必須轉(zhuǎn)化成float類型才能進(jìn)行計(jì)算。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/123355.html

相關(guān)文章

  • 初學(xué)者福音!可能是最適合的Java學(xué)習(xí)路線和方法推薦。

    摘要:學(xué)習(xí)完多線程之后可以通過下面這些問題檢測自己是否掌握,下面這些問題的答案以及常見多線程知識(shí)點(diǎn)的總結(jié)在這里??蛇x數(shù)據(jù)結(jié)構(gòu)與算法如果你想進(jìn)入大廠的話,我推薦你在學(xué)習(xí)完基礎(chǔ)或者多線程之后,就開始每天抽出一點(diǎn)時(shí)間來學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問題,已經(jīng)開源,目前已經(jīng) 35k+ Star。會(huì)一直完善下去,歡迎建議和指導(dǎo),同時(shí)也歡迎Star: https://...

    yanest 評論0 收藏0
  • C語言】從入門到入土(指針篇)

    摘要:在位機(jī)器上,如果有個(gè)地址線,那一個(gè)指針變量的大小是個(gè)字節(jié),才能存放一個(gè)地址。就是一個(gè)指針變量,也有自己的類型,指針變量的類型我們可以發(fā)現(xiàn)指針的定義方式是類型星號(hào)。也就是說存儲(chǔ)什么變量類型就用什么指針變量類型。 ...

    陳偉 評論0 收藏0
  • 8道經(jīng)典JavaScript面試題解析,真的掌握JavaScript嗎?

    摘要:瀏覽器的主要組成包括有調(diào)用堆棧,事件循環(huán),任務(wù)隊(duì)列和。好了,現(xiàn)在有了前面這些知識(shí),我們可以看一下這道題的講解過程實(shí)現(xiàn)步驟調(diào)用會(huì)將函數(shù)放入調(diào)用堆棧。由于調(diào)用堆棧是空的,事件循環(huán)將選擇回調(diào)并將其推入調(diào)用堆棧進(jìn)行處理。進(jìn)程再次重復(fù),堆棧不會(huì)溢出。 JavaScript是前端開發(fā)中非常重要的一門語言,瀏覽器是他主要運(yùn)行的地方。JavaScript是一個(gè)非常有意思的語言,但是他有很多一些概念,大...

    taowen 評論0 收藏0
  • 【轉(zhuǎn)】成為Java頂尖程序員 ,看這10本書

    摘要:實(shí)戰(zhàn)高并發(fā)程序設(shè)計(jì)這本書是目前點(diǎn)評推薦比較多的書,其特色是案例小,好實(shí)踐代碼有場景,實(shí)用。想要學(xué)習(xí)多線程的朋友,這本書是我大力推薦的,我的個(gè)人博客里面二十多篇的多線程博文都是基于此書,并且在這本書的基礎(chǔ)上進(jìn)行提煉和總結(jié)而寫出來的。 學(xué)習(xí)的最好途徑就是看書,這是我自己學(xué)習(xí)并且小有了一定的積累之后的第一體會(huì)。個(gè)人認(rèn)為看書有兩點(diǎn)好處:showImg(/img/bVr5S5);  1.能出版出...

    DTeam 評論0 收藏0
  • [翻譯]解NodeJS看這一篇

    摘要:當(dāng)這些隱藏于幕后的工作者處理完委托給它們的事件后,它們會(huì)觸發(fā)綁定在這些事件上的回調(diào)函數(shù)去通知。習(xí)慣回調(diào)是一個(gè)單線程事件驅(qū)動(dòng)的運(yùn)行環(huán)境,也就是說,在里,任何事都是對事件的響應(yīng)。 原文地址:https://codeburst.io/the-only-nodejs-introduction-youll-ever-need-d969a47ef219 作者:vick_onrails 摘要:這...

    pakolagij 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<