C語言運算符

一、前言

在嵌入式開發中,我們一般選用C語言作為開發語言。一個主要的原因在於C語言提供了大量的運算符,比如我們對硬件的操作一般涉及到對位的操作,而C語言就提供了這樣的運算符,這是其他語言不具備的。

C語言運算符

二、C語言運算符有哪些

C語言有大量的運算符,可大致分為以下幾類:括號與結構體符號、單目、算術、移位、關係、位、邏輯、三目、賦值、逗號。

括號與結構體符號:括號包括()、[],結構體符號指的是結構體成員引用時的符號“->”、“.”,他們也是運算符,並且優先級與括號相當,這也是我們把兩者放在一起討論的原因。至於如何使用則是結構體的內容。

單目運算符:單目運算符有很多,例如:!邏輯非、~按位取反、++自增、--自減、+正、-負、&求地址運算符、*間址運算符、sizeof()求所佔字節數、(類型名)強制類型轉換。這些運算符的運算對象只有一個。其中&與*屬於指針內容,我們不做細說。邏輯非我們在下面邏輯運算符時說明,按位取反我們在下面位運算符時說明,強制類型轉換我們在格式轉換時說明。Sizeof()首先不是函數,用於求類型的所佔字節數。例如:int a;sizeof(a)或sizeof(int)得到的值都是4,即整型佔4個字節。()中可以是變量也可以是數據類型也可以是字符串常量。例如:char ch[20]=”hello”;我們定義字符數組來保存字符串,當我們要求字符串長度時我們發現sizeof(ch)得到的大小為20,即數組的大小,那麼怎麼求字符串長度呢?我們可以用字符串的相關函數strlen(),但是也可以sizeof(“hello”);它的結果為6,即計算字符串最後的空字符’\0’。++與--是我們經常用到的運算符,簡單來說,有以下四種情況:

a=10,a++ ++在a的後面,先把a的值賦值給表達式,a在自加1。即 a=10,b=a,a=a+1

a=10,++a ++在a的前面,a先自加1,再把a的值賦值給表達式。即 a=10,a=a+1,b=a

a=10,a-- --在a的後面,先把a的值賦值給表達式,a在自減1。即 a=10,b=a,a=a-1

a=10,--a --在a的前面,a先自減1,再把a的值賦值給表達式。即 a=10,a=a-1,b=a

上例中a++/++a/a--/--a代表表達式,我們可以理解為:b=a++/b=++a/b=a--/b=--a

算術運算符:+、-、*、/、%。需要注意的是,在做相乘運算時,*不能省略。/表示除號,%表示取餘。例:10/3=3 10%3=1 這裡%是取10除以3後的餘數,所以結果為1。要注意的是%左右兩邊必須都是整數。而10/3的結果為什麼是3而不是3.3333呢?這裡涉及到格式轉換的知識,是我們格式轉換部分要說的。

移位運算符:>> << 。移位運算符右移與左移是對位進行操作。例如:a=10,b=a>>1,

此例的意思是把數值a往右移動1位,把結果賦值給b。我們知道數據在內存中以二進制存放,10對應的二進制位1010,各位往右移一位得到0101,最右邊的0被移出去,左邊空的一位我們補0,所以b的值為0101,即5。這是右移,如果數據右邊有足夠多的0,我們可以往右移動多位,規律為往右移動移位相當於除以2,移動兩位相當於除以2^2,移動n位相當於除以2^n.左移<

相當於把1010往左移兩位變為10 1000,即b的值為40.我們發現在數值上相當於a*2^2。

所以我們的規律就是:往右移n位,相當於除以2^n 。往左移n位,相當於乘以2^n 。實際上我們就是用左移右移來代替乘除的,這樣不需要計算與賦值過程,只需要將各位移動,更加快捷。

關係運算符:>大於、= 大於或等於、<=小於或等於、==等於、!=不等於。關係運算符用於比較大小,需要注意的是:1、關係運算符的寫法。當要表示10

&&是邏輯與運算符,表示並且。2、關係運算符的值是邏輯值。例如:a=10,b=20; a

如果關係成立,即邏輯為真,那麼值就是1.如果關係不成立,即邏輯為假,那麼值就是0.

邏輯運算符:&&邏輯與、||邏輯或、!邏輯非。邏輯運算符的值也是邏輯值,需要注意的是對數據來說非0為真,0為假。這三個運算符的關係為:

邏輯與:兩個數據全為真的時候結果才為真

1 1 1

1 0 0

0 1 0

0 0 0

邏輯或:兩個數據有一個為真結果就為真

1 1 1

1 0 1

0 1 1

0 0 0

邏輯非:!是單目運算符,非真為假,非假為真。!0結果是1,!-1結果是0,!1結果也是0

位運算符:按位與&、按位或、按位取反、按位異或^。這些運算符也是對位的操作與邏輯運算符要注意區分。例如:10&20。我們看做:讓各位進行相與

01010

& 1 0100

00000

那麼10&20的結果就是0。

與或關係我們都知道,在補充一下異或關係,相同為假,不同為真。

1 1 0

1 0 1

0 1 1

0 0 0

我們知道這些都是對位的操作,我們要額外說一下按位取反。例如:int a=1;~a的值為什麼呢?我們打印之後發現結果為-2。這涉及到數據存放的知識。我們要知道數據以補碼形式存放、補碼形式打印。a的二進制,0000 0001,是一個正數,它的補碼為它本身0000 0001,這裡我們只以一個字節為例。當我們~a後按各位取反,得到1111 1110,當我們打印這個數據時,需要補碼打印,這時候它的最高位為1,表示負數,負數的補碼為它的反碼加一。即:

1000 0001+1 = 1000 0010 對應的十進制為-2。

三目運算符:?:。它是條件語句的內容,C語言中只有這一個三目運算符,即運算對象有三個。例如:a=10,b=20,a>b?a:b的值為b的值。即a大於b為真時a的值是表達式的值,否則b的值是表達式的值。

賦值運算符:=、+=、-=、*=、/=、%=、&=、^=、!=、<<=、>>=。即上面的符號與=相結合。=叫賦值號,使用時要注意,例如:int a=10,表示把數據10賦值給整型變量a。a+=b表示a=a+b,其他符號用法相同。

逗號運算符:“,”。例如:a=(b+c,c+d,d+e);a的值為d+e的值,即最後一個表達式的值。所以逗號表達式的值為最後一個式子的值。但這並不表示前面的式子沒用,例如:a=(b++,c+d,b+d);我們要從左向右計算,因為b++改變了b的值,所以要先b++,在b+d。

三、運算符優先級

我們在做簡單的符合運算時,比如:a+b/c+d 我們是先讓b/c,在讓三者進行相加。這裡/號比加減運算優先級要高。同理,當我們的式子包含了以上運算符時,我們就要理清先算誰再算誰。這裡我們已經將運算符的優先級整理為一句話:優先級從高到低依次為:

() 單目算術 移位 關係 位 邏輯 三目 賦值 逗號

四、運算符結合性

這裡討論的情況是當式子中幾個運算符優先級相同時,應該先算誰再算誰。例如:*p++,我們知道*與++都是單目運算符,這時候先算哪個呢?我們也給大家總結了一句話:

單目、三目、賦值運算符結合性自右向左,其他運算符結合性自左向右。

我們給瞭如下三個例子:

Int a=10,int *p=&a,求*p++。根據結合性自右向左,應該先算p++,即p指向a上面的那塊空間。所以*p++表示a上面那塊空間的值。

a>b?a>c?a:c:b>c?b:c; 這個式子表示的是求三個數最大值。根據結合性自右向左,先算b>c?b:c求b和c的最大值,在算a>c?a:c求a和c的最大值。最後比較a與b的值。

a=b+c=a+b;這種寫法是錯誤的,因為他的結合性自右向左,且+優先級比=高,所以是先把a+b的值賦值給b+c,我們無法把一個值賦值給表達式,即賦值號左邊不能為式子。

五、格式轉換規則

1、運算符左右兩邊類型相同時,得到的結果也是這個類型。例:1/2=0,10/3=3

2、運算符左右兩邊類型不同時,先把他們往精確度更高的一側轉換,變為相同的類型。 例:1.0/2=0.5,10/3.0=3.333333

3、賦值號右面的數據會自動轉換為左面的數據類型。例:int a=2.678。a的值為2

4、我們可以對數據進行強制類型轉換。例:float a=2.789,(int)(a);a的類型變為int,值為2

最後,想學習C語言的小夥伴們!

請關注+私信回覆:“C語言視頻”領取一份為大家準備的學習資料!


分享到:


相關文章: