前言
C語言是一門面向過程的、抽象化的通用程序設(shè)計語言,廣泛應(yīng)用于底層開發(fā)。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產(chǎn)生少量的機器語言以及不需要任何運行環(huán)境支持便能運行的高效率程序設(shè)計語言。
本篇文章是基于C語言,對入門小知識操作符的講解,展示平臺為Visual Studio,所有操作符的輸入都是在英文輸入法下進行輸入。文章較長,請耐心觀看!
目錄
前言
正文部分
1.? 算數(shù)操作符
1.1 算數(shù)操作符+
?1.3 算數(shù)操作符*
1.4算數(shù)操作符/
2.? 移位操作符和位操作符
2.1? 移位操作符
2.2? 位操作符
?3.? =賦值操作符
3.1? =直接賦值
3.2? 復(fù)合賦值
3.3 其他特殊操作符間接賦值
4.? 單目操作符
4.1? !邏輯反操作符
4.2? +正值
4.3? -負值?
?4.4? &取地址和*解釋引用
4.5? sizeof操作數(shù)的類型長度
4.6? ~二進制位反制符
4.7? 前,后置++?
?4.8? 前后置--
4.9? (類型)強制類型轉(zhuǎn)換
5.? 關(guān)系操作符
5.1? 大于>和小于<
5.2? 大于等于和小于等于
5.4? ==等于
?6.? 邏輯操作符
6.1? &&邏輯與
6.2? ||邏輯或
7. 條件操作符
8.? 逗號表達式
9.? 下標引用,函數(shù)調(diào)用以及結(jié)構(gòu)成員符
9.1? [ ]下標引用符
10.? 關(guān)于操作符的其他規(guī)則
?10.1? 關(guān)于數(shù)值計算時值型的轉(zhuǎn)換
?10.2? ?操作符的優(yōu)先級
說在最后
正文部分
1.? 算數(shù)操作符
C語言中的算術(shù)操作符有
+加,-減,*乘,/除,%除余 ??
1.1 算數(shù)操作符+
加號大家應(yīng)該都不陌生,其實在C語言中加號的使用方法非常單純,就是相加,例如1+1=2。
圖1? 算數(shù)操作符+
1.2 算數(shù)操作符-
減號的使用與加號相同,也是單純的相減。
圖2? 算數(shù)操作符-
?1.3 算數(shù)操作符*
*號在生活中可能不常見,它代表的是乘號,即"X",但由于C語言的定義,在編譯器中,*為乘號。它的使用也比較簡單,就是相乘。
圖3? 算術(shù)操作符*
1.4算數(shù)操作符/
/號在生活中也很少見,多見于部分手機計算器中,/在C語言中是除號?,但C語言定義/是除的意思,但/除號在C語言中的用法卻很講究,特別是整型和浮點型值涉及小數(shù)的計算,是不同的。
1.4.1? 首先是簡單的整除
圖4? 算術(shù)操作符/簡單整除 1.4.2? 不能整除的情況
圖5? 算術(shù)操作符/不能整除的情況 可以看出,7/2應(yīng)該是等于3.5的,可是輸出的結(jié)果卻是3。
那么是什么原因呢?在C語言編譯器中,對于整型值的整除,由于值是整型,編譯器輸出時會向零取整。所以,即便是3.99,編譯器仍會輸出3。
我們變換一下定義方式,用浮點型進行定義和計算。
圖6??算術(shù)操作符/浮點型整除 可以發(fā)現(xiàn),轉(zhuǎn)換為浮點型之后,計算的值帶有小數(shù),且為3.5,說明值的計算與定義的值類型非常重要。
但在后面的研究中,我又發(fā)現(xiàn)了一個情況,及時定義了浮點型也輸出3。
圖7? 算術(shù)操作符/浮點型整除它例 ?那這是為什么?
這是因為計算機在計算時,是先計算右值再賦給左值a,所以先計算的值取整為3,所以輸出3.000000。我們只需要讓計算機知道數(shù)為浮點數(shù),再計算就可以了。
?圖7? 算術(shù)操作符/浮點型相除
1.5? 算數(shù)操作符%
%在生活中是百分比的意思,但在C語言中%的意思是除余,有些整數(shù)相除不能得到整數(shù),例如剛剛所示例的7/2,除余就是一直相除,除到剩下的值無法再除時輸出這個無法相除的值,這個值就是余數(shù)。例如7/2>5/2>3/2>1/2,其中,最后1/2無法整除,編譯器便會輸出1。
圖8? 算術(shù)操作符% 這里要說的是,%只能對整數(shù)除余,如果定義float浮點型,編譯器會報錯。
2.? 移位操作符和位操作符
這兩種操作符都是非常底層的,對二進制代碼進行操作,此處只是大概介紹一下功能,以后有機會,借例子著重介紹。
2.1? 移位操作符
位移操作符分為:
左移操作符<<和右移操作符>> 2.1.1??右移操作符>>
>>表示將值的二進制碼向右移位。
圖8? 右移操作符 ?原理講解:
由于a是整型,在VS編譯器中,VS屬于64位軟件,所以a占4字節(jié),4B=32bit,二進制就是32位。
則a的二進制存儲結(jié)構(gòu)為000000000000000000000000000010。
圖中a>>1表示a的二進制編碼向右移1位,當然a>>2就是移位。
若向右移一位則結(jié)構(gòu)為000000000000000000000000000001,1后的0被消除掉,前面開頭空出來的一位用0補齊(第一個數(shù)為符號位,0位正數(shù),1位負數(shù)),由二進制算法,a目前是1。
??
2.1.2? <<左移操作符
?<<表示將值的二進制碼向左移位。
圖9? 左移操作符 ?原理與右移相同,向左移一位, 000000000000000000000000000100,開頭消除一個0末尾由于空缺,補上一個零,由二進制算法,a目前是4。
原理簡圖:
圖10? 移位操作符原理
2.2? 位操作符
位操作符這里介紹的有三個,分別是:
&按位與,|按位或,^按位異或 這三個操作符都是對值的二進制數(shù)進行計算,前面我們已經(jīng)提到過,在編譯器中,一個整型值的二進制數(shù)是32位,所以是對這32位數(shù)進行操作運算。
2.2.1? &按位與的運算原理
該運算是將兩數(shù)的二進制為進行運算,當兩數(shù)二進制位都為1時,保留該位上的1,否則為0,
即1&1=1,1&0=0,0&0=0;這樣說比較抽象,我們進行示例:
圖11? 按位與操作符代碼示例 ?原理如圖:
圖12? 按位與原理圖解 ?2.2.2? |按位或的運算原理
|按位或的運算與按位與相反,當兩數(shù)二進制位都為0時,保留該位上的0,否則為1。即1|1=1,0|1=1,0|0=0;我們還是先上圖:
圖13? 按位或操作符代碼示例 原理如圖:
圖14? 按位或原理圖解 2.2.3? ^?按位異或的運算原理
^按位異的運算與前兩個操作符不同,該操作符是兩個數(shù)的同一個二進制位,相同為0,不同為1。
即1^1=0,0^0=0,1^0=1;代碼示例:
圖15? 按位異或操作符代碼示例 ?原理如圖:
圖16? 按位異或原理圖解
?3.? =賦值操作符
賦值操作符=是給定義的變量進行賦值,如果只使用=,那么就是直接賦值;
還有一些賦值是搭配其他操作符進行運算后再進行賦值:
+=自增賦值,-= 自減賦值,*=自乘賦值,/=自除賦值,%=自除余賦值 其中,還有一些特殊操作符的使用我們已經(jīng)介紹過了:
&=按位與賦值,^=按位異或賦值,|=按位或賦值,>>=右移后賦值,<<=左移后賦值 在與賦值操作符一起連用時,我們會對知識點進行補充以代碼運行結(jié)果的形式展現(xiàn)。
3.1? =直接賦值
3.1.1? 賦值數(shù)值
3.1.1.1? 整型常量直接賦值
圖例? 整型常量直接賦值 ?將整型常量1直接賦值給整型變量a。
3.1.1.2? 浮點型常量直接賦值
圖17? 浮點型數(shù)值直接賦值 將浮點型常量1.5直接賦值給浮點型變量a。
3.1.2? 賦值字符
3.1.2.1? 字符型常量直接賦值
圖18? 字符型常量直接賦值 將字符型常量‘C’直接賦值給字符型常量a。
??
?3.1.2.2? 字符串常量直接賦值
圖19? 字符串常量直接賦值 ?將字符串常量“CSDN”直接賦值給字符型數(shù)組a[5];
3.2? 復(fù)合賦值
3.2.1? +=自增賦值
圖20? 自增賦值 如圖20,a+=1相當于a=a+1。
??
?3.2.2? -=自減賦值
圖21? 自減賦值 如圖21,a-=1相當于a=a-1。
??
?3.2.3? *=自乘賦值
圖22? 自乘賦值 ?如圖22,a*=2相當于a=a*2。
3.2.4? /=自除賦值
圖23? 自除賦值 ?如圖23,a/=2相當于a=a/2。?
??
3.2.5? %=自除余賦值
圖24? 自除余賦值 ??如圖24,a%=2相當于a=a%2。?
??
3.3 其他特殊操作符間接賦值
3.3.1? &=按位與賦值
圖25? 按位與賦值 ???如圖25,a&=2相當于a=a&2。?
3.3.2? |=按位或賦值
圖26? 按位或賦值 ?如圖26,a|=2相當于a=a|2。
??
3.3.3? ^=按位異或賦值?
圖27? 按位異或賦值 ??如圖27,a^=2相當于a=a^2。
3.3.4? >>=右移操作符賦值
圖28? 右移操作符賦值 ?如圖28,a>>=2相當于a=a>>2;這里要提醒的是,a>>2表示二進制位向右移動兩位。
3.3.5? >>=左移操作符賦值
圖29? 左移操作符賦值 ?如圖29,a>>=2相當于a=a>>2;這里要提醒的是,a<<2表示二進制位向左移動兩位。
4.? 單目操作符
單目操作符有:
!邏輯反,+正值,-負值,&取地址,sizeof操作數(shù)的類型長度,~對二進制位反制,
前后置++,前后置--,*解引用操作符,”(類型)“強制類型轉(zhuǎn)換
4.1? !邏輯反操作符
反邏輯操作符就是是否變換,是變不是,邏輯反制?
圖30? 邏輯反操作符 如圖30,?第一個if我們的條件中放的是非i,我們定義i=0,非i就是非0,if判斷語句的判斷條件是1為真,執(zhí)行語句,否則為0即為假,跳過執(zhí)行,這里要說的是,并非判斷條件一定是1,當輸入數(shù)值大于1是也成立。當我們再次給i進行賦值,執(zhí)行結(jié)果與!1的一樣,表示!操作符將i的值反值為非0,那if語句就成立了,所以!是將邏輯反制,一般在if判斷依據(jù)和while循環(huán)語句中常用,以后會詳細介紹。
4.2? +正值
顧名思義,就是讓值為正。
圖31? 正值 編譯器默認正值省略+符號!
4.3? -負值?
顧名思義,就是讓值為負,當然也可以負負為正。
圖32? 負值
?4.4? &取地址和*解釋引用
大家可能看到&符號想到了前面的按位與,但&符號還能取地址,大家知道C語言是所有語言中比較底層的語言,可以通過指解釋引用符*也就是針訪問地址,顧名思義,取地址符&就是獲取某個變量的內(nèi)存地址,常與解釋引用符*指針連用,后面會詳細介紹,這里做簡單講解。
圖33? 取地址符和解釋引用符 ?如圖可以發(fā)現(xiàn),通過取地址符,將獲取的地址賦值給解釋引用變量*b(指針*b),然后輸出,若單獨輸出b則是輸出b所存放的a的地址,如果加上解釋引用符,則是輸出指向地址存放的值地址,即b=&a=10091628,*b=a=0。
4.5? sizeof操作數(shù)的類型長度
sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲大小,操作數(shù)可以是一個表達式或括在括號內(nèi)的類型名,操作數(shù)的存儲大小由操作數(shù)的類型決定。
圖34? 操作數(shù)的類型長度 ?由圖34,可以發(fā)現(xiàn),整型int的類型大小為4,也就是分配的內(nèi)存空間為4字節(jié),而字符型char的類型大小為1
在定義數(shù)組時,我們又發(fā)現(xiàn),如果對數(shù)組名求類型大小,那么輸出的是整個數(shù)組的類型大小,且單個元素的類型大小等于一個整型的類型大小,字符型也一樣,字符型數(shù)組單個元素的類型大小等于單個字符型變量的類型大小。
所有sizeof是求操作符的類型大小,也可以說是所分配的內(nèi)存空間大小。
4.6? ~二進制位反制符
~是用來對一個二進制數(shù)按位取反,即將0變1,將1變0。
圖35? 二進制位反制符 原理圖解:
圖36? 反制操作符原理
4.7? 前,后置++?
先上代碼:
圖37? 前后置++ ?如圖,可以發(fā)現(xiàn),前置++是先計算k+1再賦值給a,所有賦給a的值是2;而后置++則是先將值傳遞賦給b再計算i+1,所以前后置++在使用時需要考慮邏輯。
?4.8? 前后置--
原理與前后置++相同,不多說,我們直接示例:
圖38? 前后置--
4.9? (類型)強制類型轉(zhuǎn)換
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int Π = 3.14; return 0; }
?對于一個整型變量Π,如果我們強行賦值給它一個浮點型變量3.14,那么部分編譯器會報錯!
"“初始化” : 從“double”轉(zhuǎn)換到“int”,可能丟失數(shù)據(jù)";
所以,我們需要強制類型轉(zhuǎn)換來解決這個問題:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int Π = (int)3.14; return 0; }
如上代碼段,對值進行(int)3.14后,值就被強行轉(zhuǎn)換為3(C語言向零取整)。
5.? 關(guān)系操作符
關(guān)系操作符在判斷語句中常用,用來構(gòu)成一定的邏輯,主要有:
>大于,小于<,>=大于等于,<=小于等于,!=不等(非等),==等于 5.1? 大于>和小于<
顧名思義,<和>與平常生活中理解相似,也就是大于小于,但在編程中常用于邏輯判斷,如:?
圖39? 大于小于
5.2? 大于等于和小于等于
顧名思義,在大于小于的基礎(chǔ)上,包含了等于,如果值相等也滿足條件,如:
圖40? 大于等于和小于等于
5.3? !=不等?
顧名思義,!=就是不等于的意思,例如:
圖41? 不等 ?如圖,當我們輸入非2的數(shù)時,編譯器判斷成立。
5.4? ==等于
首先,在C語言中=是賦值,而雙等于號才是等于,但沒有賦值的功能,顧名思義,==就是等于,只不過一般是判斷兩個值是否相等,如:
圖42? 等于
?6.? 邏輯操作符
C語言中邏輯操作符有:
&&邏輯與和||邏輯或 這里我們需要先與按位與和按位或區(qū)分一下,按位與&與邏輯與&&以及按位或|和邏輯或||有相同的地方;不過按位與和按位或是對數(shù)值的二進制位進行改變,而邏輯與和邏輯或常用于邏輯判斷。
6.1? &&邏輯與
對于邏輯與,我們舉個很簡單的例子,在邏輯判斷中,例如if,1為真0為假,那么邏輯與則是1&&1=1,1&&0=0,0&&0=0,也就是說,很多時候我們的判斷條件有兩個,我們需要兩個條件都滿足才執(zhí)行下面的語句,所以兩個條件任何一個不滿足則為0。?
圖43? 邏輯與 可以看出,左圖中只滿足a>10條件而不滿足b<10的條件,所以判斷不成立;右圖滿足a>10和b<10的條件所以判斷成立。
??
6.2? ||邏輯或
對于邏輯或,有一點與邏輯與相反,從字面意思可以理解,或就是條件一或者條件二滿足一個都可以,事實也確實如此,邏輯或是1||0=1,1||1=1,0||0=0,可以發(fā)現(xiàn),當所有條件不滿足時才為假,有一個條件成立則為真。即:
圖 44 邏輯或 可以發(fā)現(xiàn),?左圖中a條件不滿足,但滿足b條件,if判斷仍然為真,但右圖中,ab條件都不滿足,所有判斷為假。
7. 條件操作符
格式為:
(條件語句)?(語句1):(語句2) 那么這是什么意思呢?我們先上一段代碼和運行結(jié)果:
圖45? 條件操作符邏輯示例 ?從圖45中可以發(fā)現(xiàn),當輸入的數(shù)滿足a>5的條件if就判斷執(zhí)行為真的語句,那么我們修改一下,用條件操作符的形式來寫,如圖:
圖46? 條件操作符示例 ?從圖46的運行結(jié)果中,大家應(yīng)該知道了條件操作符的大概用處了,也是做判斷,問號?號前面是條件,類似于if()括號里面也是放的條件語句,但是,若條件成立,則執(zhí)行語句1,也就是冒號前(問號后)的語句,如果不成立則執(zhí)行冒號后的語句,也就是語句2。
條件操作符在日常使用的地方非常多,小到返回一個數(shù),大到調(diào)用函數(shù)甚至更多!
圖47? 條件操作符調(diào)用函數(shù)(左)和返回數(shù)值(右) ?這些在后面會慢慢詳細介紹。
8.? 逗號表達式
表達式1,表達式2,表達式3,......表達式n 這里要先提及的是,逗號表達式在使用時一般用括號括起來,這樣理解起來也很方便:
(表達式1,表達式2,表達式3,......表達式n) 逗號在編譯時很常用,但什么是逗號表達式呢?逗號表達式就是用逗號隔開的多個表達式,從左向右依次執(zhí)行。整個表達式的結(jié)果是最后一個表達式的結(jié)果。即:
圖48? 逗號表達式 ?如圖48,可以發(fā)現(xiàn),在逗號表達式中,首先a++,a=2,然后i=a+1=3,最終k=i+1=4,b取最后一個表達式的運算結(jié)果,即4。這里先只進行簡單的介紹,后面有更復(fù)雜的用法再詳解!
9.? 下標引用,函數(shù)調(diào)用以及結(jié)構(gòu)成員符
[]下標引用,()函數(shù)調(diào)用,結(jié)構(gòu)成員符->和‘.’ 9.1? [ ]下標引用符
什么是下標?下標出現(xiàn)與數(shù)組,我們在定義數(shù)組時會在[ ]中放入需要的元素個數(shù),在定義好以后,每一個元素都有一個下標,例如arr[0],arr[5]...等,數(shù)組下標一般從0開始,如果我們存入若干個元素,要取出某個元素,則要使用下標取出數(shù)組中對于的元素,即:
圖49? 下標引用符 這里要說的是,數(shù)組的下標是從0開始的,最后一個下標不能存儲元素而是放入一個’\0‘,用來表示已經(jīng)到數(shù)組末尾。
圖50? 數(shù)組詳圖
9.2? ()函數(shù)調(diào)用
我們知道在編程中不會只有一個主函數(shù)去運行,那樣會顯得非常雜亂,各種各樣的功能會分成不同的函數(shù)去執(zhí)行,由主函數(shù)去調(diào)用,那么函數(shù)的調(diào)用就涉及函數(shù)調(diào)用的符號();上代碼:
圖51? 函數(shù)調(diào)用 從圖中可以發(fā)現(xiàn),函數(shù)調(diào)用()主要是傳遞參數(shù)!當調(diào)用的函數(shù)不需要傳遞參數(shù),括號中可以為空。
??
9.3? 結(jié)構(gòu)體成員訪問符 -> 和 ‘.’
結(jié)構(gòu)體類型變量可以通過“結(jié)構(gòu)體變量名?.?結(jié)構(gòu)體成員名”訪問;
也可以通過指針,“結(jié)構(gòu)體變量名->結(jié)構(gòu)體成員名”訪問。
圖52? 結(jié)構(gòu)體成員訪問
10.? 關(guān)于操作符的其他規(guī)則
?10.1? 關(guān)于數(shù)值計算時值型的轉(zhuǎn)換
數(shù)值在進行計算時如果遇到不同的值類型的數(shù)值進行計算,就會涉及值類型的轉(zhuǎn)換問題,通常優(yōu)先級是:
圖53? 數(shù)值轉(zhuǎn)換優(yōu)先級 ??
?10.2? ?操作符的優(yōu)先級
操作符的屬性分為:“操作符的優(yōu)先級 ”,“操作符的結(jié)合性”,“是否控制求值順序”。
當兩個操作符一起使用時,具體先執(zhí)行哪一個,需要看操作符的優(yōu)先級,如果兩個操作符處于同一級別,那么則看操作符之間的結(jié)合性!
說在最后
以上就是本次文章的所有內(nèi)容!如內(nèi)容有誤,請在評論區(qū)留言,歡迎大家交流!
同時感謝各位的耐心閱讀,能看到這里的小伙伴們應(yīng)該都是學(xué)霸啦!?
對于C語言入門,這些基本知識還是非常重要的,就像英語的學(xué)習,日積月累。
目前自己的水平也處于入門階段,希望以后能更加深入學(xué)習,寫出更好的文章貢獻給大家。
最后希望跟我一樣處于入門階段的同學(xué)們一起共同進步,水平蒸蒸日上。文章來源:http://www.zghlxwxcb.cn/news/detail-656404.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-656404.html
到了這里,關(guān)于C語言初級<操作符>的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!