一文詳解C語言操作符
一、基礎(chǔ)篇
1.算數(shù)操作符
+ - * / % += -= *= /= 這些操作符是我們編程時候最常用的幾個算數(shù)操作符
+ - * 等算數(shù)操作符就不用再多說了,與正常的數(shù)學(xué)用法相同,下面是一些常用但是初學(xué)者可能不太容易把握、易錯的算數(shù)操作符
(1)/ 操作符
/:除法,除法在C語言中分為整數(shù)除法和浮點(diǎn)數(shù)除法
整數(shù)除法:/d的兩個操作數(shù)都為整數(shù),計(jì)算方法是向下取整
得到的結(jié)果為
浮點(diǎn)數(shù)除法:儲存值的變量必須是浮點(diǎn)數(shù), 兩個操作數(shù)中至少有一個為浮點(diǎn)數(shù),但除數(shù)或者被數(shù)不一定要用浮點(diǎn)數(shù)存儲,只需要在計(jì)算時進(jìn)行轉(zhuǎn)化即可
%.nlf也可以使結(jié)果自動四舍五入保留n位小數(shù)
(2)%取余操作符
取余運(yùn)算符得到的是余數(shù),但取余操作符的兩個操作數(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ù)只有一個的操作符
(1)! 操作符
! 邏輯反操作,將真變?yōu)榧?,將假變?yōu)檎?/p>
在邏輯定義中,0表示假,非0則表示真
在這段代碼中,先給i賦初值0,然后在while判斷是否進(jìn)入循環(huán)時,!0就是真,進(jìn)入循環(huán),但為了防止死循環(huán),我們加上一個限制條件,保證只打印5次
同樣,如果while判斷條件只有一個0時,則說明為假,不進(jìn)入循環(huán),打印0次
(2)sizeof 操作符
sizeof(類型名);sizeof()返回?zé)o符號的所計(jì)算的對象或者類型所占空間的大小,單位是字節(jié)
sizeof經(jīng)常也用來計(jì)算數(shù)組元素的個數(shù)
(3)~操作符
~:按位取反操作符,對二進(jìn)制位進(jìn)行按位取反,將二進(jìn)制補(bǔ)碼每一位的0變1,1變0。注意,是對補(bǔ)碼進(jìn)行操作,負(fù)數(shù)要先將原碼變?yōu)檠a(bǔ)碼,同時取反得到的也是補(bǔ)碼,看結(jié)果還得再變?yōu)樵a
從圖中可以看出,0在按位取反后應(yīng)該是 -1,同樣,在編譯器上驗(yàn)證
(4)++、--操作符
前置++,前置--:先將變量+1或者-1,再作為表達(dá)式的值使用(先++,再使用)
后置++,后置--:先將變量的值作為表達(dá)式使用,再將變量+1或者-1(先使用,再++)
用上面的口訣想起來就容易多了
(5)& 取地址操作符
&:取出某個變量、數(shù)組、函數(shù)等的地址,在比價復(fù)雜的代碼中,我們經(jīng)常用指針進(jìn)行操作,&操作符就可以取出地址賦值給指針變量
(6)* 間接訪問操作符
間接訪問操作符,也稱解引用操作符,操作數(shù)是地址或指針,可以通過對地址的解引用,找到地址中存儲的變量,對變量進(jìn)行間接操作
(7)()強(qiáng)制類型轉(zhuǎn)化
():將一種數(shù)據(jù)類型的變量強(qiáng)制轉(zhuǎn)化為另一種數(shù)據(jù)類型
如參數(shù)需要一個無符號的整形變量,而你目前所有的是一個整形變量啊,就可以通過強(qiáng)制類型轉(zhuǎn)化轉(zhuǎn)化為組符號的整形,這個經(jīng)常用于函數(shù)參數(shù)的優(yōu)化部分
如:(unsigned int)a 即可將a轉(zhuǎn)化為無符號的整形,同樣,強(qiáng)制類型轉(zhuǎn)化盡量要遵守由低到高轉(zhuǎn)化,否則,也會丟失精度
3.邏輯操作符
&& 邏輯與 操作符:“同時都要滿足”
|| 邏輯或 操作符:“滿足其中一個即可”
1&&2---->1 0&&1----->0
1||2 ---->1 0||1----->1
1表示真,0表示假
例:找出1000---2000之間的閏年
閏年:如果year能夠被4整除,并且不能被100整除,則year是閏年?;蛘呷绻鹹ear能夠被400整除,則year是閏年,判斷閏年就恰好用到了這兩個操作符
int year = 0; for (year = 1000; year < 2000; year++) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) //判斷閏年 printf("%d ", year); }
邏輯操作符這里有一個超級易錯點(diǎn)
對于&&來說,如果表達(dá)式左邊為0,則說明在邏輯上已經(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的值使用,在對a加1。剛使用的表達(dá)式a的值為0,并且在&&的左邊,所以后面++b,d++不再計(jì)算。
同樣,對于||來說,如果表達(dá)式左邊為非0則說明在邏輯上已經(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++這個表達(dá)式的值為0,繼續(xù)執(zhí)行,但是++b的值為3,在||操作符的左邊,并且在邏輯上已經(jīng)為真了,所以后面的d++不再計(jì)算
4.條件操作符
條件操作符是C語言中唯一一個三目操作符
表達(dá)式1如果為真,即計(jì)算表達(dá)式2,同時表達(dá)式2的結(jié)果就是三目操作符的運(yùn)算結(jié)果
表達(dá)式2如果為假,即計(jì)算表達(dá)式3,同時表達(dá)式3的結(jié)果就是三木操作符的運(yùn)算結(jié)果
也可以在編譯器里面運(yùn)行來驗(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.逗號表達(dá)式
逗號表達(dá)式,就是用逗號隔開的多個表達(dá)式。里面的表達(dá)式從左向右依次執(zhí)行,整個表達(dá)式的結(jié)果是最后一個表達(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;然后將這個逗號表達(dá)式整體的值(即b=a+1)賦給變量c
即 c=13;
需要注意的是逗號表達(dá)式的每一個表達(dá)式都必須從左向右依次計(jì)算
6.下標(biāo)引用,函數(shù)調(diào)用和結(jié)構(gòu)體成員訪問
(1)下標(biāo)引用操作符[]
arr[2]=2;//將2賦值給arr[2]
[ ]就是下標(biāo)引用操作符,arr和2是[ ]的兩個操作數(shù),arr為數(shù)組名,2為索引值
(2)函數(shù)調(diào)用操作符()
()可以接受一個或者多個操作數(shù):第一個操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù),函數(shù)傳參可以傳多個參數(shù)
(3)結(jié)構(gòu)體訪問操作符.->
用法:
結(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)體變量訪問結(jié)構(gòu)體成員 } void set_age2(struct Stu* pStu) { pStu->age = 18;//結(jié)構(gòu)體指針變量訪問結(jié)構(gòu)體成員 } int main() { struct Stu stu; struct Stu* pStu = &stu; stu.age = 20;//結(jié)構(gòu)成員訪問 set_age1(stu); pStu->age = 20;//結(jié)構(gòu)成員訪問 set_age2(pStu); return 0; }
7.關(guān)系操作符
>
>=
<
<=
== 用于測試“相等”
!= 用于測試“不相等”
二、進(jìn)階篇
1.二進(jìn)制
(1)二進(jìn)制的計(jì)算
(2)二進(jìn)制的存儲
2.移位操作符
移位操作符移動的是二進(jìn)制的補(bǔ)碼,且操作數(shù)只能為整數(shù)
<< 左移操作符:將二進(jìn)制位整體向左移動,左邊丟棄,右邊補(bǔ)零
圖為將-15左移1位
>> 右移操作符:將二進(jìn)制位整體向右移動,右邊丟棄,左邊補(bǔ)符號位
圖為將-15右移一位
負(fù)數(shù)學(xué)會了,整數(shù)就更簡單了,因?yàn)檎麛?shù)的原碼,反碼,補(bǔ)碼都一樣,不用互相轉(zhuǎn)化
3.位操作符
位操作符的操作數(shù)必須為整數(shù)
& 按位與: a&b 對應(yīng)的二進(jìn)制補(bǔ)碼 :有0則為0,同時為1才為1
| 按位或: a|b 對應(yīng)的二進(jìn)制補(bǔ)碼 :有1則為1,同時為0才為0
^ 按位異或: a^b 對應(yīng)的二進(jìn)制補(bǔ)碼 :相同為0,不同為1
實(shí)例1:不創(chuàng)建第三個變量,實(shí)現(xiàn)兩個整數(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非常大時,a+b可能會超過存儲范圍(長度大于整形)
方法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; }
在解釋原因前,先演示一下按位異或的幾個規(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:求一個整數(shù)存儲在內(nèi)存中的二進(jìn)制中1的個數(shù)
一個數(shù)&1可以得到它的最低位(詳細(xì)參考按位與操作符圖解),如果a&1==1,說明a的最低位是1如果a&1==0,說明a的最低位是0,那么思路就清晰了,只需要將a的二進(jìn)制位多次右移,每次右移后&1得到它的最低位,判斷是否為1,為1的話,計(jì)數(shù)器就++,將32個二進(jìn)制位盡皆遍歷,即可知道共有多少個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); }
三、同一操作符的不同類型操作數(shù)之間的轉(zhuǎn)化
例如:將整形3存到浮點(diǎn)型變量中,沒問題。但是,將一個浮點(diǎn)型的數(shù)字存到一個整形變量中去,就可能會出現(xiàn)精度丟失問題。這些轉(zhuǎn)化需要我們在寫代碼的時候自行完成
四、操作符的優(yōu)先級
C語言操作符的優(yōu)先級
優(yōu)先級 | 運(yùn)算符符號 | 名稱或者含義 |
---|---|---|
1 | []、().-> | 數(shù)組下標(biāo)引用、圓括號、結(jié)構(gòu)體訪問 |
2 | -、(類型)、++、--、*、&、!、~、sizeof | 負(fù)號、強(qiáng)制類型轉(zhuǎn)化、自加、自減、解引用、取地址、邏輯非、按位取反、siaeof |
3 | /、*、% | 除號、乘號、取模 |
4 | +、- | 加、減 |
5 | <<、>> | 左移、右移 |
6 | >、>=、<、<= | 大于、大于等于、小于、小于等于 |
7 | ==、!= | 等于、不等于 |
8 | & | 按位與 |
9 | ^ | 按位異或 |
10 | | | 按位或 |
11 | && | 邏輯與 |
12 | || | 邏輯或 |
13 | ?: | 條件(三目)運(yùn)算符 |
在使用這張表時需仔細(xì)核對運(yùn)算符的符號和名稱,但在大多數(shù)情況下,我們選擇直接將需要優(yōu)先計(jì)算的用圓括號括起來,不過最基本的順序還是得知道的,總不能一份代碼到處都是圓括號吧。
以上就是一文詳解C語言操作符的詳細(xì)內(nèi)容,更多關(guān)于C語言操作符的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼
本文主要介紹了C語言實(shí)現(xiàn)動態(tài)鏈表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05c++類成員函數(shù)如何做函數(shù)參數(shù)
這篇文章主要介紹了c++類成員函數(shù)如何做函數(shù)參數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11C++ Qt開發(fā)之ComboBox下拉組合框組件用法詳解
Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中,ComboBox(組合框)是一種常用的用戶界面控件,它提供了一個下拉列表,允許用戶從預(yù)定義的選項(xiàng)中選擇一個,本文給大家介紹QComboBox類的一些常用方法,需要的朋友可以參考下2023-12-12C++中overload,override,overwrite的區(qū)別詳細(xì)解析
以下是對C++中overload,override,overwrite的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字
這篇文章主要為大家介紹了C/C++題解LeetCode1295統(tǒng)計(jì)位數(shù)為偶數(shù)的數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01