C語言(四)
阿新 • • 發佈:2018-11-24
第四章 運算子
- 4.1 分類
- C語言的運算子範圍很廣,可分為以下幾類:
- 1、算術運算子:用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求餘(%)、自增(++)、自減(--)共七種。
- 2、賦值運算子:用於賦值運算,分為簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
- 3、逗號運算子:用於把若干表示式組合成一個表示式(,)。
- 4、關係運算符:用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)六種。
- 5、邏輯運算子:用於邏輯運算。包括與(&&)、或(||)、非(!)三種。
- 6、條件運算子:這是一個三目運算子,用於條件求值(?:)。
- 真前假後
- 7、位操作運算子:參與運算的量,按二進位制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
- 8、指標運算子:用於取內容(*)和取地址(&)二種運算。
- 9.、求位元組數運算子:用於計算資料型別所佔的位元組數(sizeof)。
- 10、特殊運算子:有括號(),下標[],成員(→,.)等幾種。
- 另外,按參與運算的物件個數,C語言運算子可分為:單目運算子 (如 !)、雙目運算子 (如+,- )和三目運算子 (如 ? : )。
- 級別由大到小:(邏輯)非 >算(術運算子) >關(系運算子) >(邏輯)與 >(邏輯)或 >條(件運算子) >賦(值運算子)
- C語言的運算子範圍很廣,可分為以下幾類:
- 4.2算術運算子和算術表示式
- 4.2.1 基本的算術運算子與表示式
- 算術運算子
- (1)+(加法運算子或正值運算子,如2+5)。
- (2)-(減法運算子或負值運算子,如4-2)。
- (3)*(乘法運算子,如3*8)。
- (4)/(除法運算子,如11/5)。
- /的運算分為兩種情況:
- a、“除”的左右兩邊都為整數時,所得結果必然是整數(注意:僅取整數部分,不是四捨五入)
- 比如:5/2的值為2,不是2.5,1/2的值為0。
- b、“除”的左右兩邊至少有一個是實型資料(即小數)時,所得結果為實型資料。
- 比如:5/2.0的值為2.5,7.0/2.0的值為3.5.
- a、“除”的左右兩邊都為整數時,所得結果必然是整數(注意:僅取整數部分,不是四捨五入)
- /的運算分為兩種情況:
- (5)%(模運算子或稱求餘運算子,%兩側均應為整型資料,如9%7的值為2)。
- 需要說明的是:當運算物件為負數時,所得結果隨編譯器不同而不同,在vc中,結果的符號與被除數相同,比如:13%-2值為1,而-15%2值為-1.
- %符號兩邊要求是整數。不是整數就錯了
- 表示式:
- 是表示式就一定有數值。算術表示式是用算術運算子和括號將運算量(也稱運算元)連線起來的、符合C語言語法規則的表示式。運算物件包括函式、常量和變數等。
- 賦值表示式:
- 表示式數值是最左邊的數值,a=b=5;該表示式為5,常量不可以賦值。
- 自加、自減表示式:
- 假設a=5,++a(是為6), a++(為5);執行的機理:++a 是先把變數的數值加上1,然後把得到的數值放到變數a中,然後再用這個++a表示式的數值為6,而a++是先用該表示式的數值為5,然後再把a的數值加上1為6,再放到變數a中。 進行了++a和a++後 在下面的程式中再用到a的話都是變數a中的6了。
- 考試口訣:++在前先加後用,++在後先用後加。
- 逗號表示式:
- 優先級別最低 ;表示式的數值逗號最右邊的那個表示式的數值。(2,3,4)的表示式的數值就是4。
- 算術表示式和運算子的優先順序與結合性
- 在計算機語言中,算術表示式的求值規律與數學中的四則運算的規律類似,其運算規則和要求如下。
- (1)在算術表示式中,可使用多層圓括號,但括號必須配對。運算時從內層圓括號開始,由內向外依次計算各表示式的值。
- (2)在算術表示式中,對於不同優先順序的運算子,可按運算子的優先順序由高到低進行運算,若表示式中運算子的優先順序相同,則按運算子的結合方向進行運算。
- (3)如果一個運算子兩側的運算元型別不同,則先利用自動轉換或強制型別轉換,使兩者具有相同型別,然後進行運算。
- 在計算機語言中,算術表示式的求值規律與數學中的四則運算的規律類似,其運算規則和要求如下。
- 自增自減運算子
- 作用:使變數的值增1或減1。
- 如:
- ++i,--i (在使用i之前,先使i的值加1、減1)。
- i++,i-- (在使用i之後,使i的值加1、減1)。
- 如:
- (1)只有變數才能用自增運算子 (++)和自減運算子(--),而常量或表示式不能用,如10++或(x+y)++都是不合法的。
- (2)++和--的結合方向是“自右向左“,如 -i++ ,i的左邊是負號運算子,右邊是自增運算子,負號運算和自增運算都是 “自右向左“結合的,相當於-(i++)。
- (3)在迴圈語句中常用到自增(減)運算子,在指標中也常用到該運算子,區別“i++”和“++i”及“i--”和“--i”,表示式的值和變數的值。
- 例:變數n的初始值為2,則
- 表示式型別 i++ ++i i-- --i
- n值為2時各表示式的值 2 3 2 1
- 經過各表示式運算後變數n的值變化為 3 3 1 1
- 例:變數n的初始值為2,則
- (4)l 當++或—與printf語句結合時,若++/--x的形式,則先自增/自減,然後輸出;若x++/--的形式,則先輸出x原值,在進行自增/自減操作。
- 有以下程式
- #include
- main()
- { int x=011;
- printf("%d\n",++x); //10
- }
- 【解析】011是一個八進位制的數,轉為十進位制則為1*8+1=9;++x是x先自增1再參與其他運算,所以先x自增1為10再輸出即為10,故選C。
- 有以下程式
- 作用:使變數的值增1或減1。
- 算術運算子
- 4.2.1 基本的算術運算子與表示式
- 4.3 賦值運算子與賦值表示式
- 4.3.1賦值運算子與賦值表示式
- 賦值符號
- =
- 作用
- 將一個數據賦給一個變數或將一個變數的值賦給另一個變數,由賦值運算子組成的表示式稱為賦值表示式。
- 一般形式為:
- 變數名 = 表示式
- 注意
- 賦值運算子左邊必須是變數,而不是表示式。
- 在程式中可以多次給一個變數賦值,每賦一次值,與它相應的儲存單元中的資料就被更新一次,記憶體中當前的資料就是最後一次所賦值的那個資料。
- 例:a=12; 此表示式讀作“將10的值賦值給變數a”。
- 如果賦值號兩邊的運算物件型別不一致,系統會自動進行型別轉換,轉換的規則:將賦值號右邊表示式的值的型別轉換成賦值號左邊變數的型別,
- 例:int y=3.5; 在變數y中最終儲存的是整數3。
- 可以將賦值表示式的值再賦值給變數,形成連續賦值。
- 例如:x=y=25是一個連續賦值表示式,x=y=25 等價於x=(y=25),所以表示式x=y=25 最終的值為25 。
- 賦值符號
- 4.3.2複合的賦值運算子
- 在賦值運算子之前加上其他運算子可以構成複合賦值運算子。其中與算術運算有關的複合運算子是:+=,-=,*=,/=,%= 。
- 兩個符號之間不可以有空格,複合賦值運算子的優先順序與賦值運算子的相同。表示式n+=1等價於n=n+1,作用是取變數n中的值增1再賦給變數n,其他複合的賦值運算子的運算規則依次類推。
- 如求表達a+=a-=a*a的值,其中a的初值為12 。
- 步驟:
- (1)先進行“a-=a*a“運算,相當於a=a-a*a=12-144=-132 。
- (2)再進行“a+=-132“運算,相當於 a=a+(-132)=-132-132=-264 。
- 4.3.1賦值運算子與賦值表示式
- 4.4 逗號運算子和逗號表示式
- 概念
- 在c語言中,逗號除了作為分隔符,還可以用作一種運算子----逗號運算子,用逗號運算子將幾個表示式連線起來,例如a=b+c,a=b*c等稱為逗號表示式。
- 一般形式為:
- 表示式1 ,表示式2 ,表示式3 , …,表示式n
- 例:x=2,y=3,z=4
- 表示式1 ,表示式2 ,表示式3 , …,表示式n
- 注意
- 逗號表示式具有從左至右的結合性,即先求解表示式1,然後依次求解表示式2,直到表示式n的值。表示式n的值就是整個逗號表示式的值。上述的逗號表示式的值就是表示式z=4的值4.需要注意的是,逗號運算子是所有運算子中級別最低的。
- 例:有如下程式段:
- main()
- {
- inta=2,b=4,c=6,x,y;
- y=(x=a+b),(b+c);
- printf("y=%d,x=%d",y,x);
- }
- 程式顯示結果為:y=6,x=6
- 例:有如下程式段:
- 逗號表示式具有從左至右的結合性,即先求解表示式1,然後依次求解表示式2,直到表示式n的值。表示式n的值就是整個逗號表示式的值。上述的逗號表示式的值就是表示式z=4的值4.需要注意的是,逗號運算子是所有運算子中級別最低的。
- 概念
- 4.5關係運算符和關係表示式
- 4.5.1 C語言中的邏輯值
- C語言中的邏輯值只有兩個:真(true)和假(flase)。用非零代表真,用零代表假。因此,對於任意一個表示式,如果它的值為零,就代表一個假值,如果它的值為非零,就代表一個真值。只要值不是零,不管是正數,負數,整數,實數,都代表一個真值。例如-5的邏輯值為真。
- 4.5.2 關係運算符
- 由兩個字元組成的運算子之間不可以加空格,關係運算符都是雙目運算子。
- (1)結合性:自左向右。
- (2)優先次序:前4種關係運算符( <,<=,>=,> )的優先級別相同,後兩種 (==,!=)優先順序相同,且前4種優先順序高於後兩種;關係運算符的優先順序低於算術運算子,高於賦值運算子。
- 由兩個字元組成的運算子之間不可以加空格,關係運算符都是雙目運算子。
- 4.5.3關係表示式
- 由關係運算符連線而成的表示式稱為關係表示式。
- 例如:a>b,(a=7)>(b=10)等都是合法的關係表示式。
- 關係表示式的結果有兩個:0和1,。其中0表示假,1表示真。如果關係表示式成立,則值為真,如果關係表示式不成立,則值為假。
- 例:變數a的值為5,b的值為6,那麼關係表示式a>b的值為假,即為0.而關係表示式
- (a=13)>(b=10)的值為真,即為1。
- 當關系運算子兩邊值的型別不一致時,若一邊是整型,一邊是實型,系統將自動把整型數轉化為實型數,然後再進行比較。
- 由關係運算符連線而成的表示式稱為關係表示式。
- 4.5.1 C語言中的邏輯值
- 4.6 邏輯運算子和邏輯表示式
- 4.6.1邏輯運算子及其優先順序
- C語言提供了3種邏輯運算子
- 優先順序 由高到低
- 邏輯運算子 !(邏輯非) 高於 &&(邏輯與)高於 ││(邏輯或)
- 說明:
- “&&”和“||”是雙目運算子,要求要有兩個運算元,而“!”是單目運算子,只要求有一個運算元即可。
- 以上邏輯運算子的優先順序是:“!”(邏輯非)級別最高,其次是“&&”(邏輯與),“||”(邏輯或)級別最低,邏輯運算子中的“&&”和“||”低於關係運算符,“!”高於算術運算子。
- 即:“!”(邏輯非)>算術運算子>關係運算符>“&&”>“||”>賦值運算子>逗號運算子。
- 4.6.2邏輯表示式
- “&&”和“||”的運算物件有兩個,故它們都是雙目運算子,而!的運算物件只有一個,因此它是單目運算子。
- 邏輯運算舉例如下:
- (1)a&&b: 當&&兩邊都為“真”時,表示式a&&b的值才是真。
- 值得注意的是:在數學中,關係式0<x<10是可以使用的,表示x的值應在大於0且小於10的範圍內,但在C語言中卻不能用0<x<10這樣一個關係表示式來表示上述的邏輯關係,即關係運算符不能連用,但可以藉助邏輯運算子來輔助運算,正確的表示方法是 0<x && x<10。
- (2)a||b: 當||兩邊有一個為“真”時,表示式a||b的值就是真。
- (3)!a: 表示取反,如果a為真,則!A為假,反之亦然。例如!-5的值就為0.
- (1)a&&b: 當&&兩邊都為“真”時,表示式a&&b的值才是真。
- 4.6.3短路
- 在C語言中,由&&或||組成的邏輯表示式,在某些特定情況下會產生“短路“現象。
- (1)x && y && z ,只有當x為真(非0)時,才需要判別y的值;只有x和y都為真時,才需要去判別z的值;只要x為假就不必判別y和z,整個表示式的值為0。口訣:“一假必假”。
- 例:(!5==1)&&(++i==0) (!5==1)表示式的值為0,所以計算機執行中就跳過(++i==0)此表示式,(!5==1)&&(++i==0)表示式的值為0.
- (2)x||y||z ,只要x的值為真(非零),就不必判別y和z的值 ,整個表示式的值為1,只有x的值為假,才需要判別y的值,只有x和y的值同時為假才需要判別z的值,口訣:“一真必真”。
- (1)x && y && z ,只有當x為真(非0)時,才需要判別y的值;只有x和y都為真時,才需要去判別z的值;只要x為假就不必判別y和z,整個表示式的值為0。口訣:“一假必假”。
- 在C語言中,由&&或||組成的邏輯表示式,在某些特定情況下會產生“短路“現象。
- 4.6.1邏輯運算子及其優先順序
- 4.7 位運算
- 4.7.1位運算子與位運算
- 在計算機中,資料都是以二進位制數形式存放的,位運算就是指對儲存單元中二進位制位的運算。C語言提供6種位運算子。
- 操作符 含義 規則
- & 按位與 若兩個相應的二進位制位都為1,則該位的結果為1,否則為0
- | 按位或 兩個相應的二進位制位中只要有一個為1,則該位的結果為1,否則為0
- ^ 按位異或 若兩個二進位制位同號,則結果為0,異號為1
- 異或的位運算
- 0 異或 1得到1、
- 0 異或 0得到0、
- 1 異或 1得到0,
- 相同為0,不同為1
- 例 3 ∧
- 設二進位制數a是00101101 ,若通過異或運算a∧b使a的高4位取反,低4位不變,則二進位制數b是11110000。
- 解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變數。
- 如 inta=3 , b=4;,想將a與b的值互換,可用如下語句實現:
- a=a∧b;
- b=b∧a;
- a=a∧b;
- 如 inta=3 , b=4;,想將a與b的值互換,可用如下語句實現:
- 解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變數。
- 設二進位制數a是00101101 ,若通過異或運算a∧b使a的高4位取反,低4位不變,則二進位制數b是11110000。
- 例 3 ∧
- 異或的位運算
- ~ 按位求反 按位取反,即0變1,1變0
- << 左移 將一個數的二進位制全部左移若干位
- 例1<<
- 左移運算子“<<”是雙目運算子。其功能把“<< ”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數指定移動的位數,高位丟棄,低位補0。
- 例如:
- a<<4
- 指把a的各二進位向左移動4位。如a=00000011(十進位制3),左移4位後為00110000(十進位制48)。
- 例如:
- 左移運算子“<<”是雙目運算子。其功能把“<< ”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數指定移動的位數,高位丟棄,低位補0。
- 例1<<
- >> 右移 將一個數的二進位制位全部右移若干位
- 例 2>>
- 右移運算子“>>”是雙目運算子。其功能是把“>>”左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位數。
- 例如:
- 設 a=15,
- a>>2
- 表示把000001111右移為00000011(十進位制3)。
- 例如:
- 右移運算子“>>”是雙目運算子。其功能是把“>>”左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位數。
- 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。
- 例 2>>
- 說明:
- (1)位運算中除“~“以外,均為雙目運算子,要求兩側各有一個運算量。
- (2)運算量只能是整型或字元型資料,不能為實型資料。
- (3)在沒有捨去資料的時候,<<左移一位表示乘以2;>>右移一位表示除以2。
- (4)特別要注意:c語言中是用非0表示邏輯真的,用0表示邏輯假的
- (5)位運算子& |~<< >> ∧ 按優先順序從高到低排列的順序是:
- 位運算子中求反運算“~“優先順序最高,
- 而左移和右移相同,居於第二,
- 接下來的順序是按位與 “&“、按位異或 “∧“和按位或 “|“。
- 順序為~ << >> & ∧ | 。
- 在計算機中,資料都是以二進位制數形式存放的,位運算就是指對儲存單元中二進位制位的運算。C語言提供6種位運算子。
- 4.7.1位運算子與位運算