目錄
1、操作符分類
2、操作符的屬性
3、算術(shù)操作符
4、移位操作符
5、位操作符
6、賦值操作符
7、單目操作符
8、關系操作符
9、邏輯操作符
10、條件操作符
11、逗號操作符
12、下標引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
1、操作符分類
算術(shù)操作符(+,-,*,/,%)
移位操作符(<<,>>)
位操作符(&,|,^)
賦值操作符(=,+=,-=,/=,*=,%=,<<=,>>=)
單目操作符(!,-,+,&,sizeof,~,--,++,*,(類型))
關系操作符(>,>=,<,<=,!=,==)
邏輯操作符(&&,||)
條件操作符(exp1?exp2:exp3)
逗號表達式(exp1,exp2,exp3,-expN)
下標引用、函數(shù)調(diào)用和結(jié)構(gòu)成員([],(),->)
2、操作符的屬性
復雜表達式的求值有三個影響的因素:
- 操作符的優(yōu)先級
- 操作符的結(jié)合性
- 是否控制求值順序
兩個相鄰的操作符先執(zhí)行哪一個?取決于它們的優(yōu)先級。如果兩者的優(yōu)先級相同,取決于它們的結(jié)合性
操作符 | 描述用 | 用法示例 | 結(jié)果類型 | 結(jié)合性 | 是否控制求值順序 |
() | 聚組 | (表達式) | 與表達式相同 | N/A | 否 |
() | 函數(shù)調(diào)用 | rexp(rexp,...,rexp) | rexp | L-R | 否 |
[] | 下標引用 | rexp[rexp] | lexp | L-R | 否 |
. | 訪問結(jié)構(gòu)成員 | lexp.member_name | lexp | L-R | 否 |
.> | 訪問結(jié)構(gòu)指針成員 | rexp->member_name | lexp | L-R | 否 |
++ | 后綴自增 | lexp ++ | rexp | L-R | 否 |
-- | 后綴自減 | lexp -- | rexp | L-R | 否 |
! | 邏輯反 | ! rexp | rexp | R-L | 否 |
~ | 按位取反 | ~ rexp | rexp | R-L | 否 |
+ | 單目,表示正值 | + rexp | rexp | R-L | 否 |
- | 單目,表示負值 | - rexp | rexp | R-L | 否 |
++ | 前綴自增 | ++ lexp | rexp | R-L | 否 |
-- | 前綴自減 | -- lexp | rexp | R-L | 否 |
* | 間接訪問 | * rexp | lexp | R-L | 否 |
& | 取地址 | & lexp | rexp | R-L | 否 |
sizeof | 取其長度,以字節(jié) 表示 | sizeof rexp sizeof(類型) | rexp | R-L | 否 |
(類型) | 類型轉(zhuǎn)換 | (類型) rexp | rexp | R-L | 否 |
* | 乘法 | rexp * rexp | rexp | L-R | 否 |
/ | 除法 | rexp / rexp | rexp | L-R | 否 |
% | 整數(shù)取余 | rexp % rexp | rexp | L-R | 否 |
+ | 加法 | rexp + rexp | rexp | L-R | 否 |
- | 減法 | rexp - rexp | rexp | L-R | 否 |
<< | 左移位 | rexp << rexp | rexp | L-R | 否 |
>> | 右移位 | rexp >> rexp | rexp | L-R | 否 |
> | 大于 | rexp > rexp | rexp | L-R | 否 |
>= | 大于等于 | rexp >= rexp | rexp | L-R | 否 |
< | 小于 | rexp < rexp | rexp | L-R | 否 |
<= | 小于等于 | rexp <= rexp | rexp | L-R | 否 |
== | 等于 | rexp == rexp | rexp | L-R | 否 |
!= | 不等于 | rexp != rexp | rexp | L-R | 否 |
& | 位與 | rexp & rexp | rexp | L-R | 否 |
^ | 位異或 | rexp ^ rexp | rexp | L-R | 否 |
| | 位或 | rexp | rexp | rexp | L-R | 否 |
&& | 邏輯與 | rexp && rexp | rexp | L-R | 是 |
|| | 邏輯或 | rexp || rexp | rexp | L-R | 是 |
?: | 條件操作符 | rexp ? rexp : rexp | rexp | N/A | 是 |
= | 賦值 | lexp = rexp | rexp | R-L | 否 |
+= | 以...加 | lexp += rexp | rexp | R-L | 否 |
-= | 以...減 | lexp -= rexp | rexp | R-L | 否 |
*= | 以...乘 | lexp *= rexp | rexp | R-L | 否 |
/= | 以...除 | lexp /= rexp | rexp | R-L | 否 |
%= | 以...取模 | lexp %= rexp | rexp | R-L | 否 |
<<= | 以...左移 | lexp <<= rexp | rexp | R-L | 否 |
>>= | 以...右移 | lexp >>= rexp | rexp | R-L | 否 |
&= | 以...與 | lexp &= rexp | rexp | R-L | 否 |
^= | 以...異或 | lexp ^= rexp | rexp | R-L | 否 |
|= | 以...或 | lexp |= rexp | rexp | R-L | 否 |
, | 以...或 | rexp,rexp | rexp | L-R | 是 |
3、算術(shù)操作符
算數(shù)操作符有+,-,*,/,%
加法運算符用于加法運算,使其兩側(cè)的值相加。相加的值(運算對象)可以是變量,也可以是常量
sum = num1 + num2
計算機會查看加法運算符右側(cè)的兩個變量,把它們相加,然后把和賦給變量sum
sum,num1,num2都是可修改的左值,每個變量都標識了一個可被賦值的數(shù)據(jù)對象。
但是表達式num1+num2是一個右值
減法運算符用于減法運算,使其左側(cè)的數(shù)減去右側(cè)的數(shù),+和-運算符被稱為二元運算符,這些運算符需要兩個運算對象才能完成操作。
但+和-也能作為符號運算符,減號可用于標明或改變一個值的代數(shù)符號。
a = -100;
b = -a;
以這種形式使用的負號被稱為一元運算符,一元運算符只需要一個運算對象,C90標準添加了一元+運算符,它不會改變運算對象的值或符號。
乘法運算符用*號來表示,使其兩側(cè)的值相乘。相乘的值(運算對象)可以是變量,也可以是常量
除法運算符用/號來表示,/左側(cè)的值是被除數(shù),右側(cè)的值是除數(shù)。有著整數(shù)除法和浮點數(shù)除法,整數(shù)除法和浮點數(shù)除法不同。浮點數(shù)除法的結(jié)果是浮點數(shù),而整數(shù)除法的結(jié)果是整數(shù)。整數(shù)是沒有小數(shù)部分的數(shù)。在C語言中,整數(shù)除法結(jié)果的小數(shù)部分被丟棄,在一過程被稱為截斷。
當/操作符的兩個操作符都為整數(shù),執(zhí)行整數(shù)除法;而只要有浮點數(shù)執(zhí)行的就是浮點數(shù)除法。
求模運算符用%號來表示,求模運算符用于整數(shù)計算。求模運算符給出其左側(cè)整數(shù)除以右側(cè)整數(shù)的余數(shù)。求模運算符的兩個操作數(shù)必須位整數(shù),返回的是整除之后余數(shù),不能用于浮點數(shù)。
4、移位操作符
移位運算符有左移運算符(<<)和右移運算符(>>)。用二進制數(shù)做案例。
左移運算符(<<)將其左側(cè)運算對象每一位的值向左移動其右側(cè)運算對象指定的位數(shù)。左側(cè)運算對象移出左末尾段位的值丟失,用0填充空出的位置。
(0000 0001)<< 2? ? ? ? //表達式
(0000 0100)? ? ? ? ? ? ? ? //結(jié)果值
?右移運算符(>>)將左側(cè)運算對象每一位的值向右移動其右側(cè)對象指定的位數(shù)。左側(cè)運算對象移出右末端位的值。對于無符號類型,用0填充空出的位置(邏輯移位);對于有符號類型,其結(jié)果取決于機器,空出的位置可用0填充,或者用符號位(最左端的位)的副本填充(算術(shù)右移)。
移位運算符針對2的冪提供快速有效的乘法和除法:
number << n? ? ? ? number乘于2的n次冪
number >> n? ? ? ? 如果number為非負,則用number除以2的n次冪
移位運算符還可用于從較大單元中提取一些位
5、位操作符
位運算符有按位取反~,按位與&,按位或|,按位異或^
都是作用于整形數(shù)據(jù),包括char。之所以叫位運算符,是因為整型操作都是針對每一個位進行,不影響它左右兩邊的位。
一元運算符~把1變?yōu)?,把0變?yōu)?。
~(1001 1010)? --- 》 (0110 0101)
二元運算符&通過逐位比較兩個運算對象,生成一個新值。對于每個位,只有兩個運算對象中響應的位都為1時,結(jié)果才為1(從真/假方面看,只有當兩個位為都為真時,結(jié)果才為真)
(1001?0011) & (0011 1101) --- 》 (0001 0001 )
二元運算符|,通過逐位比較兩個運算對象,生成一個新值。對于每個 位,如果兩個運算對象中相應的位為1,結(jié)果就為1(從真/假方面看,如果兩個運算對象中相應的一個位為真或兩個位都為真,那么結(jié)果為真)。
(1001 0011) | (0011 1101) ---》 (1011 1111)
二元運算符^逐位比較兩個運算對象。對于每個位,如果兩個運算對象 中相應的位一個為1(但不是兩個為1),結(jié)果為1(從真/假方面看,如果兩 個運算對象中相應的一個位為真且不是兩個為同為1,那么結(jié)果為真)。
(1001 0011) ^ (0011 1101) ---》 (1010 1110)
一道有趣的面試題:不能利用臨時變量,如何實現(xiàn)兩個數(shù)的交換,讀者可以想想有哪幾種方法?
6、賦值操作符
賦值運算符可以給自己定義的變量重新賦值,例如:
int score = 60;
score = 99;
賦值運算符可以和前面的算術(shù)運算符,位運算符,移位運算符組成復合賦值符,這是C語言語法所允許的。
賦值運算符允許連續(xù)使用,例如:
a = b = c + 1;
7、單目操作符
單目操作符包括!,~,+,-,&,sizeof,--,++,*,(類型)
這里就不介紹!,~,+,-,前面或后面已經(jīng)有介紹了,這里主要介紹其他幾個。
這里的&可不是按位與&,而是取地址符&,取地址符就是獲取當前變量的內(nèi)存地址,想要獲得那個變量的地址,就用&后面跟上那個變量。&后只能跟變量,不能跟常量,因為常量是一個立即數(shù),不是容器,沒有地址。
前面就提到過sizeof一嘴,這里再對sizeof進行進一步了解,sizeof運算符以字節(jié)為單位返回運算對象的大?。ㄔ贑中,1字節(jié)定義為char類型占用的空間大小。過去,1字節(jié)通常是8位,但是一些字符集可能使用更大的字節(jié))。運算對象可 以是具體的數(shù)據(jù)對象(如,變量名)或類型。如果運算對象是類型(如, float),則必須用圓括號將其括起來。
C 語言規(guī)定,sizeof 返回 size_t 類型的值。這是一個無符號整數(shù)類型, 但它不是新類型。C有一個 typedef機制(后面再介紹),允許程序員為現(xiàn)有類型創(chuàng)建別名。
++和--,遞增運算符和遞減運算符,執(zhí)行簡單的任務,將其運算對象遞增(減)1,該類運算符以兩種形式出現(xiàn)。第1種方式,++出現(xiàn)在其作用的變量前面, 這是前綴模式;第2種方式,++出現(xiàn)在其作用的變量后面,這是后綴模式。 兩種模式的區(qū)別在于遞增行為發(fā)生的時間不同。下面用一些例子來仔細地查看兩者地區(qū)別:
num1后綴遞加是原來的值,num2前綴遞加是原來的值+1,當我們再次打印num1的值的時候,發(fā)現(xiàn)num1的值實際上是加1了,這里就是前綴和后綴的區(qū)別了,前綴++先加1再賦值,后綴++先賦值再加1。初學者有可能在這里會陷入混亂。但是提供一個記憶方法:
?“前綴++處于前,所以理應先++后賦值;后綴++處于后,所以理應先賦值后++”
前綴加加和后綴加加除了上面的區(qū)別,還有著操作符優(yōu)先級的優(yōu)先關系,后綴比前綴的優(yōu)先級要高,這是要牢記的!
間接訪問操作符,通過一個指針訪問它所指向的地址的過程稱為間接訪問或解引用指針。這個用于執(zhí)行間接訪問的操作符是單目操作符*。當我們定義了一個指針變量的時候,當我們使用*得到的值就是該指針變量指向地址的變量的值。
在C語言中,類型之間的轉(zhuǎn)換是允許的。而(類型)就是其中一種,被稱為強制類型轉(zhuǎn)換。
強制轉(zhuǎn)換語法:
目標類型 變量名 = (目標類型)源變量名
可以把高類型數(shù)據(jù)轉(zhuǎn)換為低類型數(shù)據(jù),雖然有可能存在隱患,但實際上是可以轉(zhuǎn)換的,高數(shù)據(jù)類型轉(zhuǎn)換為低數(shù)據(jù)類型會產(chǎn)生丟失
低數(shù)據(jù)類型到高數(shù)據(jù)類型排序如下:
char -> short -> int -> long(unsigned char -> unsigned short -> unsigned int -> unsigned long
8、關系操作符
關系操作符包括>,>=,<,<=,!=,==
就跟數(shù)學里的比較一樣,但是要記住一點不能使用數(shù)學思維去寫判斷,下面用一個案例來說明原因:
?一些初學者可能會寫出類似的判斷語句,但是結(jié)果卻不如意,因為當執(zhí)行完第一個關系運算符之后會返回真(1)或者假(0),此時進行第二個關系運算符運算的時候,結(jié)果很有可能和實際的結(jié)果不一樣,在這種多個比較之間需要用到邏輯操作符(&&,||)
9、邏輯操作符
邏輯操作符有邏輯與&&,邏輯或||和邏輯非!
邏輯運算符 | 含義 |
&& | 與 |
|| | 或 |
! | 非 |
邏輯運算符兩側(cè)的條件必須都為真,整個表達式才為真。邏輯運算符的優(yōu)先級比關系運算符低,所以不必在子表達式兩側(cè)加圓括號。
假設exp1和exp2是兩個簡單的關系表達式(如a?> b或c?== 1000),那么:
當且僅當exp1和exp2都為真時,exp1 && exp2才為真;
如果exp1或exp2為真,則exp1 || exp2為真;
如果exp1為假,則!exp1為真;如果exp1為真,則!exp1為假。
同時需要記得一點,邏輯運算符是執(zhí)行短路求值的,何為短路求值?
在邏輯與&&中,當?shù)谝粋€判斷條件為假的時候直接結(jié)束,不對第二個判斷條件進行判斷;在邏輯或||中,當?shù)谝粋€判斷條件為真的時候直接結(jié)束,不對第二個判斷條件進行判斷。
10、條件操作符
C提供條件表達式(conditional expression)作為表達if else語句的一種 便捷方式,該表達式使用?:條件運算符。該運算符分為兩部分,需要 3 個運算對象。
條件運算符是C語言中唯一的三元運算符。條件操作符的格式:expr1?expr2:expr3
如果 expr1 為真(非 0),那么整個條件表達式的值與 expr2 的值相同;如果expr1為假(0),那么整個條件表達式的值與 expr3的值相同。
但是條件操作符也是一個有趣的操作符,看下面這段代碼:
int main(void)
{
int a = 10, b = 20;
int c = 0;
c = (a > b ? a : b);
printf("a=%d,b=%d,c=%d\n", a, b, c); //運行之后發(fā)現(xiàn)c的值和a的值一樣
return 0;
}
運行之后發(fā)現(xiàn)c的值和a的值是一樣的,條件操作符返回的是一個變量,可以賦值。
11、逗號操作符
表達式說明:
表達式1,表達式2,表達式3,...... ,表達式n
逗號表達式的要領:
(1) 逗號表達式的運算過程為:從左往右逐個計算表達式。
(2) 逗號表達式作為一個整體,它的值為最后一個表達式(也即表達式n)的值。
(3) 逗號運算符的優(yōu)先級別在所有運算符中最低。
12、下標引用、函數(shù)調(diào)用和結(jié)構(gòu)成員
[]下標引用操作符
操作數(shù):一個數(shù)組名+一個索引值
下標引用操作符允許對數(shù)組單個元素直接賦值
()函數(shù)調(diào)用操作符
接收一個或者多個操作數(shù):第一個操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)
訪問一個結(jié)構(gòu)的成員
. 結(jié)構(gòu)體.成員名
-> 結(jié)構(gòu)體指針->成員名
當我們通過訪問結(jié)構(gòu)體變量訪問成員變量的時候,我們直接使用直接訪問符(.),當我們通過訪問結(jié)構(gòu)體指針訪問成員變量的時候,我們使用簡潔訪問(->)。
通過一個案例來展示一下:文章來源:http://www.zghlxwxcb.cn/news/detail-422392.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-422392.html
到了這里,關于C語言入門篇——操作符篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!