C 學習筆記(6) C 運算子和表示式

2021-08-29 04:04:19 字數 3680 閱讀 8503

c++程式是由各式各樣的語句組成的,而語句又是由表示式轉化而來的。c++表示式是任何值或任何有效值與運算子的組合。本篇筆記總結c++程式的基本構成元素之一——表示式以及構成它所需的運算子。

一、表示式

需要明確任何值或任何有效值與運算子的組合都是表示式。同理,每個表示式都有值。例如:10本身就是乙個值為10的表示式;10+10是乙個值為20的表示式;x=20也是表示式,其中的賦值運算子(左值)使得這個表示式的值為20,也就是說你可以把這個表示式賦值給新的變數:y = (x=20).y的值也將會是20.當然,由各種運算子和值的組合都將是表示式,這裡不再一一枚舉。

在表示式後加上分號「;」,表示式則成為了語句。所有的表示式都可以成為語句,但不一定有意義。比如:a=10; 是有意義的,它將a的值賦值為10;而a+10;它也是語句,但不一定有意義,程式執行時會計算和,但並沒有應用結果,有的編譯器甚至會跳過這種語句不進行編譯。

但反過來,將語句去掉分號不一定是表示式,比如宣告語句,返回語句,for迴圈語句等等去掉分號後都不是表示式,因為它們沒有值。

下面對c++表示式中涉及到的運算子進行總結。

二、算術運算子

算術運算子包括基本算術運算子和自增自減運算子,由算術運算子、運算元和括號組成的表示式稱為算術表示式。基本算術運算子有:+(加),-(減或負號),*(乘),/(除),%(求餘)。其中"-"作為負號時為一元運算子,作為減號時為二元運算子。優先順序跟我們數學裡的是一樣的,先乘除,後加減。"%"是求餘運算,它的運算元必須是整數,比如a%b是要計算a除以b後的餘數,它的優先順序與"/"相同,這裡要注意的是,"/"用於兩個整數相除時,結果含有小數的話小數部分會捨掉,比如2/3的結果是0。如果"/"用於兩個浮點數相除時,小數部分將被保留。另外,在應用是要注意除數不能為「0」,最好在除法應用之前對除數進行判斷。

c++的自增運算子"++"和自減運算子"--"都是一元運算子,這兩個運算子都有前置和後置兩種形式,比如i++是後置,--j是前置。無論是前置還是後置都是將運算元的值增1或減1後再存到運算元記憶體中的位置。但前置和後置的表示式值計算則不同。簡單來講就是a++使用a的當前值計算表示式,然後將a的值加1;而++b的意思是先將b的值加1,然後再用新的值來計算表示式。如果i的原值是2,則i++這個表示式的結果是2(每個表示式都有值),i的值則變為3,。如果j的原值也是2,則--j這個表示式的結果是1,j的值也變為1。需要說明一點是c++在處理前置變數的函式是直接將變數加1,然後返回其值。而處理後置變數的函式是先建立乙個變數的副本,將副本加1,然後返回副本的值。因此,前置版本的效率比後置版本高。但c++的內建型別和一些現代編譯器將不會由影響。

三.賦值運算子

最簡單的賦值運算子就是"=",帶有賦值運算子的表示式被稱為賦值表示式。例如n=n+2就是乙個賦值表示式,賦值表示式的作用就是把等號右邊表示式的值賦給等號左邊的物件。賦值表示式的型別是等號左邊物件的型別,它的結果值也是等號左邊物件被賦值後的值(左值表示式),賦值運算子的結合性是自右向左。什麼叫自右向左呢?請看這個例子:a=b=c=1這個表示式會先從右邊算起,即先算c=1,c的值變為1這個表示式的值也是1,然後這個表示式就變成了a=b=1,再計算b=1,同樣b也變為1,b=1這個表示式的值也變成1,所以a也就變成了1。

除了"="外,賦值運算子還有+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。其中前五個是賦值運算子和算術運算子組成的,後五個是賦值運算子和位運算子組成的,這些運算子被叫做組合賦值運算子。這幾個賦值運算子的優先順序跟"="相同,結合性也是自右向左。l(左運算元)組合賦值運算子 r(右運算元)的意思是l = l 對應的算術運算子或位運算子 r,如,l += r; 即l=l+r。

三.逗號運算子

逗號也是乙個運算子,它的使用形式為:表示式1,表示式2。求這個表示式的值就要先解表示式1,然後解表示式2,最終這個逗號表示式的值是表示式2的值。比如計算a=1*2,a+3,應先計算a=1*2,結果為2,再計算a+3的值,a的值已經變成了2,再加上3為5,這個逗號表示式的最終結果就是5。

但要注意逗號不都是逗號運算子。比如宣告語句中的逗號就不是運算子。逗號運算子的優先順序是最低的。如a=1,2;的結果是a=1;如果a=(1,2);a的值為2.

四.關係運算子

關係運算子包括<(小於)、<=(小於等於)、>(大於)、>=(大於等於)、==(等於)、!=(不等於)。前四個的優先順序相同,後兩個的優先順序相同,而且前四個比後兩個的優先順序高。用關係運算子把兩個表示式連起來就是關係表示式,關係表示式的結果型別為bool,值只能是true或false。比如,a>b,a大於b時表示式a>b表示式的值是true,否則就是false。

這裡要特別注意賦值運算子和等於運算子的區別。因為習慣了數學表示式的=是等於的意思,在程式設計中經常會誤寫。比如if(a=5)本意是a等於5才執行後面的語句,但是實際上a=5這個表示式的值是左值5,也就是說這個if後的語句會一直執行。

五.邏輯運算子

邏輯運算子包括!(非)、&&(與)、||(或),優先順序依次降低。用邏輯運算子將關係表示式連起來就是邏輯表示式,邏輯表示式的結果也是bool型別,值也只能是true或false。"!"是一元運算子,使用形式是!運算元。非運算是對運算元取反。比如!a,a的值是true,則!a的值是false。"&&"是二元運算子,用來求兩個運算元的邏輯與,只有兩個運算元的值都是true,邏輯與的結果才是true,其他情況下結果都是false。"||"也是二元運算子,用來求兩個運算元的邏輯或,只有兩個運算元的值都是false時,邏輯或的結果才是false,其他情況下結果都是true。

六.條件運算子

c++中唯一的乙個三元運算子是條件運算子"?"。條件表示式的使用形式是:表示式1?表示式2:表示式3。表示式1是bool型別的,表示式2,3可以是任何型別,並且型別可以不同。明確條件表示式也是表示式,其的值的型別是表示式2和3中較高的型別。條件表示式會先解表示式1,如果表示式1的值是true,則解表示式2,表示式2的值就是條件表示式的值,而如果表示式1的值是false,則解表示式3,其值就是條件表示式的最終結果。比如:(a七、位運算子

(1)按位與(&)。它是對兩個運算元的二進位制形式的每一位分別進行邏輯與操作。比如3的二進位制形式為00000011,5的二進位制形式為00000101,按位與後結果是00000001。

(2)按位或(|)。它對兩個運算元的二進位制形式的每一位分別進行邏輯或操作。還是比如3和5按位或運算後結果是00000111。

(3)按位異或(^)。它對兩個運算元的每一位進行異或,也就是如果對應位相同則運算結果為0,若對應位不同則計算結果為1。例如3和5按位異或後結果為00000110。

(4)按位取反(~)。這是乙個一元運算子。它對乙個二進位制數的每一位求反。比如,3按位取反就是11111100。

(5)移位。包括左移運算(<<)和右移運算(>>),都是二元運算子。移位運算子左邊的數是需要移位的數值,右邊的數是移動的位數。左移是按指定的位數將乙個數的二進位制值向左移位,左移後,低位補0,移出的高位捨棄。右移是按照指定的位數將乙個數的二進位制值向右移位,右移後,移出的低位捨棄,如果是無符號數則高位補0,如果是有符號數,則高位補符號位或0,一般補符號位。比如,char型變數的值是-8,則它在記憶體中的二進位制補碼值是11111000,所以a>>2則需要將最右邊兩個0移出,最左邊補兩個1,因為符號位是1,則結果為11111110,對其再求補碼就得到最終結果-2。

C 運算子和表示式

歡迎購買我的專欄 1.高階c 學習 2.網路 c 提供了許多運算子。其中許多都受到內建型別的支援,可用於對這些型別的值執行基本操作。c 中有算術運算子 比較運算子 布林邏輯運算子 位運算子和移位運算子 相等運算子 在下面的 中,表示式的示例位於賦值的右側 int a,b,c a 7 b a c b ...

C 筆記(表示式 運算子和語句)

運算子是乙個符號,它表示返回 單個結果的操作 運算元是指作為運算子輸入的資料元素,可以作為運算元的結構有 表示式是運算子和運算元的字串 字元字面量有兩個單引號內的字元組成,字元字面量的型別是char,字元字面量可以是下面任意一種 常規字串字面量有雙引號內的 字元系列 組成,型別是string 逐字字...

C 運算子表示式

1 表示式概念 2 數 算符 3 運算子結果型別判定 4 賦值運算子 5 運算子優先順序 括號 乘除餘模 加減 6 布林運算子 7 運算子練習 using system namespace 運算子表示式 減 乘 除 餘 plus,less,multiply,except,remain int型別和d...