一文詳解C語(yǔ)言操作符

一文詳解c語(yǔ)言操作符

 

一、基礎(chǔ)篇

1.算數(shù)操作符

+ - * / % += -= *= /= 這些操作符是我們編程時(shí)候最常用的幾個(gè)算數(shù)操作符

+ - * 等算數(shù)操作符就不用再多說(shuō)了,與正常的數(shù)學(xué)用法相同,下面是一些常用但是初學(xué)者可能不太容易把握、易錯(cuò)的算數(shù)操作符

(1)/ 操作符

/:除法,除法在c語(yǔ)言中分為整數(shù)除法和浮點(diǎn)數(shù)除法

整數(shù)除法:/d的兩個(gè)操作數(shù)都為整數(shù),計(jì)算方法是向下取整

得到的結(jié)果為

浮點(diǎn)數(shù)除法:儲(chǔ)存值的變量必須是浮點(diǎn)數(shù), 兩個(gè)操作數(shù)中至少有一個(gè)為浮點(diǎn)數(shù),但除數(shù)或者被數(shù)不一定要用浮點(diǎn)數(shù)存儲(chǔ),只需要在計(jì)算時(shí)進(jìn)行轉(zhuǎn)化即可

%.nlf也可以使結(jié)果自動(dòng)四舍五入保留n位小數(shù)

(2)%取余操作符

取余運(yùn)算符得到的是余數(shù),但取余操作符的兩個(gè)操作數(shù)都要為整數(shù)

c的值就等于8除以3的余數(shù) 2

(3)+= -= *= /=操作符

直接舉例子:

a+=2就等同于a=a+2,將a的值加2再賦值給a

a-=2就等同于a=a-2,將a的值減2再賦值給a

*=、/=也是相同的道理

2.單目操作符

單目操作符,顧名思義,單目,就是操作數(shù)只有一個(gè)的操作符

(1)! 操作符

! 邏輯反操作,將真變?yōu)榧?,將假變?yōu)檎?/p>

在邏輯定義中,0表示假,非0則表示真

在這段代碼中,先給i賦初值0,然后在while判斷是否進(jìn)入循環(huán)時(shí),!0就是真,進(jìn)入循環(huán),但為了防止死循環(huán),我們加上一個(gè)限制條件,保證只打印5次

同樣,如果while判斷條件只有一個(gè)0時(shí),則說(shuō)明為假,不進(jìn)入循環(huán),打印0次

(2)sizeof 操作符

sizeof(類型名);sizeof()返回?zé)o符號(hào)的所計(jì)算的對(duì)象或者類型所占空間的大小,單位是字節(jié)

sizeof經(jīng)常也用來(lái)計(jì)算數(shù)組元素的個(gè)數(shù)

(3)~操作符

~:按位取反操作符,對(duì)二進(jìn)制位進(jìn)行按位取反,將二進(jìn)制補(bǔ)碼每一位的0變1,1變0。注意,是對(duì)補(bǔ)碼進(jìn)行操作,負(fù)數(shù)要先將原碼變?yōu)檠a(bǔ)碼,同時(shí)取反得到的也是補(bǔ)碼,看結(jié)果還得再變?yōu)樵a

從圖中可以看出,0在按位取反后應(yīng)該是 -1,同樣,在編譯器上驗(yàn)證

(4)++、--操作符

前置++,前置--:先將變量+1或者-1,再作為表達(dá)式的值使用(先++,再使用)

后置++,后置--:先將變量的值作為表達(dá)式使用,再將變量+1或者-1(先使用,再++)

用上面的口訣想起來(lái)就容易多了

(5)& 取地址操作符

&:取出某個(gè)變量、數(shù)組、函數(shù)等的地址,在比價(jià)復(fù)雜的代碼中,我們經(jīng)常用指針進(jìn)行操作,&操作符就可以取出地址賦值給指針變量

(6)* 間接訪問(wèn)操作符

間接訪問(wèn)操作符,也稱解引用操作符,操作數(shù)是地址或指針,可以通過(guò)對(duì)地址的解引用,找到地址中存儲(chǔ)的變量,對(duì)變量進(jìn)行間接操作

(7)()強(qiáng)制類型轉(zhuǎn)化

():將一種數(shù)據(jù)類型的變量強(qiáng)制轉(zhuǎn)化為另一種數(shù)據(jù)類型

如參數(shù)需要一個(gè)無(wú)符號(hào)的整形變量,而你目前所有的是一個(gè)整形變量啊,就可以通過(guò)強(qiáng)制類型轉(zhuǎn)化轉(zhuǎn)化為組符號(hào)的整形,這個(gè)經(jīng)常用于函數(shù)參數(shù)的優(yōu)化部分

如:(unsigned int)a 即可將a轉(zhuǎn)化為無(wú)符號(hào)的整形,同樣,強(qiáng)制類型轉(zhuǎn)化盡量要遵守由低到高轉(zhuǎn)化,否則,也會(huì)丟失精度

3.邏輯操作符

&& 邏輯與 操作符:“同時(shí)都要滿足”

|| 邏輯或 操作符:“滿足其中一個(gè)即可”

1&&2---->1 0&&1----->0

1||2 ---->1 0||1----->1

1表示真,0表示假

例:找出1000---2000之間的閏年

閏年:如果year能夠被4整除,并且不能被100整除,則year是閏年。或者如果year能夠被400整除,則year是閏年,判斷閏年就恰好用到了這兩個(gè)操作符

int year = 0;
	for (year = 1000; year < 2000; year++)
	{
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
			//判斷閏年
			printf("%d ", year);

	}

邏輯操作符這里有一個(gè)超級(jí)易錯(cuò)點(diǎn)

對(duì)于&&來(lái)說(shuō),如果表達(dá)式左邊為0,則說(shuō)明在邏輯上已經(jīng)為假了,那么右邊全部的表達(dá)就不再進(jìn)行計(jì)算,也不執(zhí)行。

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);

a++;---->是先將a的值使用,在對(duì)a加1。剛使用的表達(dá)式a的值為0,并且在&&的左邊,所以后面++b,d++不再計(jì)算。

同樣,對(duì)于||來(lái)說(shuō),如果表達(dá)式左邊為非0則說(shuō)明在邏輯上已經(jīng)為真了,那么右邊全部的表達(dá)就不再進(jìn)行計(jì)算,也不執(zhí)行。

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);

a++這個(gè)表達(dá)式的值為0,繼續(xù)執(zhí)行,但是++b的值為3,在||操作符的左邊,并且在邏輯上已經(jīng)為真了,所以后面的d++不再計(jì)算

4.條件操作符

條件操作符是c語(yǔ)言中唯一一個(gè)三目操作符

表達(dá)式1如果為真,即計(jì)算表達(dá)式2,同時(shí)表達(dá)式2的結(jié)果就是三目操作符的運(yùn)算結(jié)果

表達(dá)式2如果為假,即計(jì)算表達(dá)式3,同時(shí)表達(dá)式3的結(jié)果就是三木操作符的運(yùn)算結(jié)果

也可以在編譯器里面運(yùn)行來(lái)驗(yàn)證

int a = 0, b= 3, max1 = 0,max2;
	if (b > a)
		max1 = b;
	else
		max1 = a;
	//等同于
	max2 = (b > a) ? b : a;
	printf("%d %d", max1, max2);

運(yùn)算結(jié)果當(dāng)然是max1=3 max2=3

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

逗號(hào)表達(dá)式,就是用逗號(hào)隔開(kāi)的多個(gè)表達(dá)式。里面的表達(dá)式從左向右依次執(zhí)行,整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果。

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1)

從左向右一次算a=b+10=12 ; b=a+1=13;然后將這個(gè)逗號(hào)表達(dá)式整體的值(即b=a+1)賦給變量c

即 c=13;

需要注意的是逗號(hào)表達(dá)式的每一個(gè)表達(dá)式都必須從左向右依次計(jì)算

6.下標(biāo)引用,函數(shù)調(diào)用和結(jié)構(gòu)體成員訪問(wèn)

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

arr[2]=2;//將2賦值給arr[2]

[ ]就是下標(biāo)引用操作符,arr和2是[ ]的兩個(gè)操作數(shù),arr為數(shù)組名,2為索引值

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

()可以接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù),函數(shù)傳參可以傳多個(gè)參數(shù)

(3)結(jié)構(gòu)體訪問(wèn)操作符.->

用法:

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

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

#include <stdio.h>
struct stu
{
char name[10];
int age;
char sex[5];
double score;
};
void set_age1(struct stu stu)
{
stu.age = 18;//結(jié)構(gòu)體變量訪問(wèn)結(jié)構(gòu)體成員
}
void set_age2(struct stu* pstu)
{
pstu->age = 18;//結(jié)構(gòu)體指針變量訪問(wèn)結(jié)構(gòu)體成員
}
int main()
{
struct stu stu;
struct stu* pstu = &stu; 

stu.age = 20;//結(jié)構(gòu)成員訪問(wèn)
set_age1(stu);

pstu->age = 20;//結(jié)構(gòu)成員訪問(wèn)
set_age2(pstu);
return 0;
}

7.關(guān)系操作符

>

>=

<

<=

==用于測(cè)試“相等”

!= 用于測(cè)試“不相等”

 

二、進(jìn)階篇

1.二進(jìn)制

(1)二進(jìn)制的計(jì)算

(2)二進(jìn)制的存儲(chǔ)

2.移位操作符

移位操作符移動(dòng)的是二進(jìn)制的補(bǔ)碼,且操作數(shù)只能為整數(shù)

<< 左移操作符:將二進(jìn)制位整體向左移動(dòng),左邊丟棄,右邊補(bǔ)零

圖為將-15左移1位

>> 右移操作符:將二進(jìn)制位整體向右移動(dòng),右邊丟棄,左邊補(bǔ)符號(hào)位

圖為將-15右移一位

負(fù)數(shù)學(xué)會(huì)了,整數(shù)就更簡(jiǎn)單了,因?yàn)檎麛?shù)的原碼,反碼,補(bǔ)碼都一樣,不用互相轉(zhuǎn)化

3.位操作符

位操作符的操作數(shù)必須為整數(shù)

& 按位與:a&b 對(duì)應(yīng)的二進(jìn)制補(bǔ)碼 :有0則為0,同時(shí)為1才為1

| 按位或: a|b 對(duì)應(yīng)的二進(jìn)制補(bǔ)碼 :有1則為1,同時(shí)為0才為0

^ 按位異或: a^b 對(duì)應(yīng)的二進(jìn)制補(bǔ)碼 :相同為0,不同為1

實(shí)例1:不創(chuàng)建第三個(gè)變量,實(shí)現(xiàn)兩個(gè)整數(shù)的交換

方法1:

    int a = 2;
	int b = 3;
	printf("交換前:a = %d, b= %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("交換后:a = %d, b= %d", a, b);

這種方法在一般情況下可以,但是當(dāng)a,b非常大時(shí),a+b可能會(huì)超過(guò)存儲(chǔ)范圍(長(zhǎng)度大于整形)

方法2:用按位異或計(jì)算

int main()
{
	int a = 2;
	int b = 3;
	printf("交換前:a = %d, b= %d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交換后:a = %d, b= %d", a, b);
	return 0;
}

在解釋原因前,先演示一下按位異或的幾個(gè)規(guī)則

a^a=0詳細(xì)看圖

a^0=a 詳細(xì)看圖

a^b^a=a^a^b,即按位異或運(yùn)算滿足交換律 詳細(xì)看圖

解釋一下原因:a=a^b,然后 b= (a^b) ^b=a^0=a,即實(shí)現(xiàn)了將a的值賦給了b

同樣:a=a^b,然后a=(a^b)^a=a^a^b=0^b=b,即實(shí)現(xiàn)了將b的值賦給了a

實(shí)例2:求一個(gè)整數(shù)存儲(chǔ)在內(nèi)存中的二進(jìn)制中1的個(gè)數(shù)

一個(gè)數(shù)&1可以得到它的最低位(詳細(xì)參考按位與操作符圖解),如果a&1==1,說(shuō)明a的最低位是1如果a&1==0,說(shuō)明a的最低位是0,那么思路就清晰了,只需要將a的二進(jìn)制位多次右移,每次右移后&1得到它的最低位,判斷是否為1,為1的話,計(jì)數(shù)器就++,將32個(gè)二進(jìn)制位盡皆遍歷,即可知道共有多少個(gè)1

int main()
{

	int a = 31;//5個(gè)1
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (a & 1 == 1)	//說(shuō)明a的最低位是1
			count++;
		a >>= 1;
	}
	printf("%d", count);
}

 

三、同一操作符的不同類型操作數(shù)之間的轉(zhuǎn)化

例如:將整形3存到浮點(diǎn)型變量中,沒(méi)問(wèn)題。但是,將一個(gè)浮點(diǎn)型的數(shù)字存到一個(gè)整形變量中去,就可能會(huì)出現(xiàn)精度丟失問(wèn)題。這些轉(zhuǎn)化需要我們?cè)趯?xiě)代碼的時(shí)候自行完成

 

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

c語(yǔ)言操作符的優(yōu)先級(jí)

優(yōu)先級(jí)運(yùn)算符符號(hào)名稱或者含義
1[]、().->數(shù)組下標(biāo)引用、圓括號(hào)、結(jié)構(gòu)體訪問(wèn)
2-、(類型)、++、--、*、&、!、~、sizeof負(fù)號(hào)、強(qiáng)制類型轉(zhuǎn)化、自加、自減、解引用、取地址、邏輯非、按位取反、siaeof
3/、*、%除號(hào)、乘號(hào)、取模
4+、-加、減
5<<、>>左移、右移
6>、>=、<、<=大于、大于等于、小于、小于等于
7==、!=等于、不等于
8&

按位與

9^按位異或
10|按位或
11&&邏輯與
12||邏輯或
13?:條件(三目)運(yùn)算符

在使用這張表時(shí)需仔細(xì)核對(duì)運(yùn)算符的符號(hào)和名稱,但在大多數(shù)情況下,我們選擇直接將需要優(yōu)先計(jì)算的用圓括號(hào)括起來(lái),不過(guò)最基本的順序還是得知道的,總不能一份代碼到處都是圓括號(hào)吧。

以上就是一文詳解c語(yǔ)言操作符的詳細(xì)內(nèi)容,更多關(guān)于c語(yǔ)言操作符的資料請(qǐng)關(guān)注碩編程其它相關(guān)文章!

下一節(jié):c語(yǔ)言中字符串常用操作總結(jié)

c語(yǔ)言編程技術(shù)

相關(guān)文章
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频