一文詳解C語言操作符

一、基礎篇

1.算數操作符

+   –   *   /   %   +=   -=  *=  /=  這些操作符是我們編程時候最常用的幾個算數操作符

+ – * 等算數操作符就不用再多說瞭,與正常的數學用法相同,下面是一些常用但是初學者可能不太容易把握、易錯的算數操作符

(1)/ 操作符

/:除法,除法在C語言中分為整數除法浮點數除法

整數除法:/d的兩個操作數都為整數,計算方法是向下取整

得到的結果為

浮點數除法:儲存值的變量必須是浮點數, 兩個操作數中至少有一個為浮點數,但除數或者被數不一定要用浮點數存儲,隻需要在計算時進行轉化即可

%.nlf也可以使結果自動四舍五入保留n位小數

(2)%取餘操作符

取餘運算符得到的是餘數,但取餘操作符的兩個操作數都要為整數

 c的值就等於8除以3的餘數 2

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

直接舉例子:

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

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

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

2.單目操作符

單目操作符,顧名思義,單目,就是操作數隻有一個的操作符

(1)!  操作符

! 邏輯反操作,將真變為假,將假變為真

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

在這段代碼中,先給i賦初值0,然後在while判斷是否進入循環時,!0就是真,進入循環,但為瞭防止死循環,我們加上一個限制條件,保證隻打印5次

同樣,如果while判斷條件隻有一個0時,則說明為假,不進入循環,打印0次

(2)sizeof 操作符

sizeof(類型名);sizeof()返回無符號的所計算的對象或者類型所占空間的大小,單位是字節

sizeof經常也用來計算數組元素的個數

(3)~操作符

~:按位取反操作符,對二進制位進行按位取反,將二進制補碼每一位的0變1,1變0。註意,是對補碼進行操作,負數要先將原碼變為補碼,同時取反得到的也是補碼,看結果還得再變為原碼

從圖中可以看出,0在按位取反後應該是  -1,同樣,在編譯器上驗證

(4)++、–操作符

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

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

用上面的口訣想起來就容易多瞭

(5)&  取地址操作符

&:取出某個變量、數組、函數等的地址,在比價復雜的代碼中,我們經常用指針進行操作,&操作符就可以取出地址賦值給指針變量

(6)*  間接訪問操作符 

間接訪問操作符,也稱解引用操作符,操作數地址或指針,可以通過對地址的解引用,找到地址中存儲的變量,對變量進行間接操作

(7)()強制類型轉化

():將一種數據類型的變量強制轉化為另一種數據類型

如參數需要一個無符號的整形變量,而你目前所有的是一個整形變量啊,就可以通過強制類型轉化轉化為組符號的整形,這個經常用於函數參數的優化部分

如:(unsigned int)a   即可將a轉化為無符號的整形,同樣,強制類型轉化盡量要遵守由低到高轉化,否則,也會丟失精度

3.邏輯操作符

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

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

1&&2—->1       0&&1—–>0   

1||2   —->1       0||1—–>1

1表示真,0表示假

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

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

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

邏輯操作符這裡有一個超級易錯點

對於&&來說,如果表達式左邊為0,則說明在邏輯上已經為瞭,那麼右邊全部的表達就不再進行計算,也不執行。

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的值使用,在對a加1。剛使用的表達式a的值為0,並且在&&的左邊,所以後面++b,d++不再計算。

同樣,對於||來說,如果表達式左邊為非0則說明在邏輯上已經為瞭,那麼右邊全部的表達就不再進行計算,也不執行。

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++這個表達式的值為0,繼續執行,但是++b的值為3,在||操作符的左邊,並且在邏輯上已經為真瞭,所以後面的d++不再計算 

4.條件操作符

條件操作符是C語言中唯一一個三目操作符

表達式1如果為真,即計算表達式2,同時表達式2的結果就是三目操作符的運算結果

表達式2如果為假,即計算表達式3,同時表達式3的結果就是三木操作符的運算結果

 也可以在編譯器裡面運行來驗證

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

運算結果當然是max1=3  max2=3

5.逗號表達式

逗號表達式,就是用逗號隔開的多個表達式。裡面的表達式從左向右依次執行,整個表達式的結果是最後一個表達式的結果。

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;然後將這個逗號表達式整體的值(即b=a+1)賦給變量c

即 c=13; 

需要註意的是逗號表達式的每一個表達式都必須從左向右依次計算

6.下標引用,函數調用和結構體成員訪問

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

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

[ ]就是下標引用操作符,arr和2是[ ]的兩個操作數,arr為數組名,2為索引值

(2)函數調用操作符() 

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

(3)結構體訪問操作符.->

用法:

結構體變量.結構體成員

結構體指針變量->結構體成員

#include <stdio.h>
struct Stu
{
 char name[10];
 int age;
 char sex[5];
 double score;
};
void set_age1(struct Stu stu)
{
 stu.age = 18;//結構體變量訪問結構體成員
}
void set_age2(struct Stu* pStu)
{
 pStu->age = 18;//結構體指針變量訪問結構體成員
}
int main()
{
 struct Stu stu;
 struct Stu* pStu = &stu; 
 
 stu.age = 20;//結構成員訪問
 set_age1(stu);
 
 pStu->age = 20;//結構成員訪問
 set_age2(pStu);
 return 0;
}

7.關系操作符 

>

>=

<

<=

== 用於測試“相等”

!=  用於測試“不相等”

二、進階篇

1.二進制

(1)二進制的計算

(2)二進制的存儲

2.移位操作符

移位操作符移動的是二進制的補碼,且操作數隻能為整數

<< 左移操作符:將二進制位整體向左移動,左邊丟棄,右邊補零

圖為將-15左移1位

>> 右移操作符:將二進制位整體向右移動,右邊丟棄,左邊補符號位

圖為將-15右移一位

負數學會瞭,整數就更簡單瞭,因為整數的原碼,反碼,補碼都一樣,不用互相轉化

3.位操作符

位操作符的操作數必須為整數 

& 按位與: a&b 對應的二進制補碼 :有0則為0,同時為1才為1

| 按位或: a|b 對應的二進制補碼 :有1則為1,同時為0才為0

^ 按位異或a^b 對應的二進制補碼 :相同為0,不同為1

實例1:不創建第三個變量,實現兩個整數的交換

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

這種方法在一般情況下可以,但是當a,b非常大時,a+b可能會超過存儲范圍(長度大於整形) 

方法2:用按位異或計算

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

在解釋原因前,先演示一下按位異或的幾個規則

a^a=0 詳細看圖

a^0=a 詳細看圖

a^b^a=a^a^b,即按位異或運算滿足交換律 詳細看圖

解釋一下原因:a=a^b,然後 b=  (a^b)  ^b =a^0=a,即實現瞭將a的值賦給瞭b

同樣:a=a^b,然後a=(a^b)^a=a^a^b=0^b=b,即實現瞭將b的值賦給瞭a

實例2:求一個整數存儲在內存中的二進制中1的個數

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

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

三、同一操作符的不同類型操作數之間的轉化

例如:將整形3存到浮點型變量中,沒問題。但是,將一個浮點型的數字存到一個整形變量中去,就可能會出現精度丟失問題。這些轉化需要我們在寫代碼的時候自行完成

四、操作符的優先級

C語言操作符的優先級

優先級 運算符符號 名稱或者含義            
        1 []、().-> 數組下標引用、圓括號、結構體訪問
        2 -、(類型)、++、–、*、&、!、~、sizeof 負號、強制類型轉化、自加、自減、解引用、取地址、邏輯非、按位取反、siaeof
3 /、*、% 除號、乘號、取模
4 +、- 加、減
5 <<、>> 左移、右移
6 >、>=、<、<= 大於、大於等於、小於、小於等於
7 ==、!= 等於、不等於
8 &

按位與

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

在使用這張表時需仔細核對運算符的符號和名稱,但在大多數情況下,我們選擇直接將需要優先計算的用圓括號括起來,不過最基本的順序還是得知道的,總不能一份代碼到處都是圓括號吧。

以上就是一文詳解C語言操作符的詳細內容,更多關於C語言操作符的資料請關註WalkonNet其它相關文章!

推薦閱讀: