您好,登錄后才能下訂單哦!
這篇文章主要介紹“C語言中的運算類型有哪些”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C語言中的運算類型有哪些”文章能幫助大家解決問題。
C語言中支持下面4種類型的運算
運算類型 | 運算符 |
四則運算 | +,-,*,/,% |
關系運算 | <,>,<=,>=,==,!= |
邏輯運算 | &&,||,! |
位運算 | &,|,^,>>,<<,~ |
(+,-,*,/,%)
就是數學中的加,減,乘,除等運算
遵循先乘除后加減的運算優先級
可以使用括號改變運算順序
注意:
C語言中的除法運算,其除數不能為0
下面通過一段程序感受一下:
#include <stdio.h> int main() { int a = 5; int b = 2; double c = 3; c = a / b; printf("c = %f\n", c); c = a % b; printf("c = %f\n", c); return 0; }
下面為輸出結果:
通過上面的代碼,可以得到一些小結論:
整型數的除法運算結果會舍棄小數部分
取余(%)運算也是一種除法運算,結果為余數
浮點數不能進行取余運算
(<,>,<=,>=,==,!=)
比較兩個值大小關系或相等關系的運算
比較的結果為邏輯值: 真(1),假(0)
可以使用括號()改變關系運算的順序
如上面的圖片所示,c 的值就為0
下面通過一段代碼,感受一下:
#include <stdio.h> int main() { int a = 1; int b = 2; int c = 3; c = a != b; printf("c = %d\n", c); c = a - b >= a + b; printf("c = %d\n", c); c = (a < b) + (c < b); printf("c = %d\n", c); return 0; }
下面為輸出結果:
小技巧:如果不同類型的運算同時出現在一個表達式中,那么盡量使用括號()指明運算順序。
運算優先級(優先級:四則運算 > 關系運算 > 賦值操作)
四則運算
正負號 > 乘除運算 > 加減運算
關系運算
大小比較運算 > 相等比較運算
賦值操作
下面看一段代碼,深入感受一下運算優先級:
#include <stdio.h> int main() { int a = 1; int b = 2; int c = 0; c = a != b + a * b; printf("c = %d\n", c); return 0; }
下面為輸出結果,可以看出,c 的輸出結果為1,為什么為1呢?這是由于乘法優先級大于加法優先級大于關系運算優先級,所以程序執行過程是這樣,先計算 a * b,然后將 a * b 的結果 2 加上 b,得到4,最后再比較 a != 4,得到的結果當然為1啦,我們還可以通過反匯編來觀察代碼的執行過程。
c = a != b + a * b的匯編代碼
所以如果想得到a != b 再加上a * b的結果,一定要記得加括號,如下:
#include <stdio.h> int main() { int a = 1; int b = 2; int c = 0; c = (a != b) + (a * b); printf("c = %d\n", c); return 0; }
這樣才能得到正確結果,如下所示:
小結:
整型數除法有兩種:取商(/),取余(%)
浮點數除法與數學中除法運算相同,結果為浮點數
不同運算的優先級不同,可使用括號改變運算優先級
同一個表達式中應避免不同的運算類型(四則運算,關系運算)
邏輯運算(&&,ll,!)
邏輯運算的參與者為邏輯值(真或假)
任何非零值在邏輯運算中都為真
任何零值在邏輯運算中都為假
左操作數 | 右操作數 | 結果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
左操作數 | 右操作數 | 結果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
邏輯運算中的短路法則
對于&&運算
從左向右進行,如果有一個操作數為假,則整個表達式為假
第一個為假的操作數之后的其它操作數不再計算
對于||運算
從左向右進行,如果有一個操作數為真,則整個表達式為真
第一個為真的操作數之后的其它操作數不再計算
取非運算(!)
單目運算(只需要一個操作數),運算結果為邏輯值
對真值取非的結果為假
對假值取非得結果為真
話不多說,上代碼:
#include <stdio.h> int main() { int a = 1; int b = 2; int c = 0; c = a && b; printf("c = %d\n", c); c = !(a - b) || (c < b); printf("c = %d\n", c); c = 10000; c = !!c; printf("c = %d\n", c); return 0; }
下面為運行結果:
位運算(&,|,~,^,<<,>>)
直接對數據的二進制位進行操作
位運算的基本單位是二進制位,所以也是一種0和1的操作
可以使用括號()改變位運算的運算順序
位運算的操作數只能是整型數(浮點數不能直接進行位運算)
運算符 | 含義 | 示例 | 優先級 |
~ | 按位求反 | ~0101 -> 1010 | 1(高) |
<< | 左移:高位移出,低位補0 | 0011 << 1 -> 0110 | 2 |
>> | 右移:低位移出,高位補符號位 | 0101 >> 2 -> 0001 | 2 |
& | 按位與 | 0111 & 1100 -> 0100 | 3 |
^ | 按位異或:相同為0,不同為1 | 0111 ^ 1100 -> 1011 | 4 |
| | 按位或 | 0111 | 1100 -> 1111 | 5(低) |
注:
1.按位與和邏輯與的計算法相同:兩者為1,結果為1,否則為0
2.按位或和邏輯或的計算法相同:兩者為0,結果為0,否則為1
位運算實例
將整數5的第2個二進制位置1
將整數7的第4個二進制位取反
將整數2的最后兩位取反
將整數15右移2位,再將第2個二進制位置0
設變量a的二進制數是10101101,若想通過運算a ^ b使得a的中間4位取反,其余位不變,則b的值是多少?
代碼如下:
#include <stdio.h> int main() { printf("c = %d\n", 5 | 2); printf("c = %d\n", 7 ^ 8); printf("c = %d\n", 2 ^ 3); printf("c = %d\n", (15 >> 2) & 13); printf("c = %d\n", 173 ^ 60); return 0; }
運行結果如下:
這里需要特別注意:對某一位或者某幾位取反可以用異或(^)運算,這在工程里常用!!!
運算優先級(優先級從上到下為由高到低)
正負號>邏輯非>按位取反
乘除>加減>按位左右移
大小比較運算>相等比較運算
按位與>按位異或>按位或
邏輯與>邏輯或
賦值操作
小結
邏輯運算中有特殊的短路法則,結果確定后不再向下計算
C語言中的真值對應非零值,假值對應零值
位運算直接對數據的二進制位進行操作
位運算的操作數只能是整型數(浮點數不能直接進行位運算)
不同類型的本質在于:
占用的內存大小不同,如:short占用2字節,int占用4字節
表示具體數據的方式不同
正整數用原碼表示,負整數用補碼表示
整數型和浮點型的二進制表示不同
位運算時需要明確的知道的事
操作數的類型(占用的內存大小)
操作數是正數還是負數(符號位,數據表示)
不同類型的操作數先自動對齊再進行位運算(補符號位)
如下面的一段代碼:
short a = 1; int b = 4; int c = a | b; printf("c = %d\n",c);
b為int類型,占4個字節,a為short類型,占2個字節。所以a要先要補符號位,由于a是正數,所以補0,這樣就可以進行位運算了,得出c的結果為5。
下面來看一段代碼:
#include <stdio.h> int main() { short a = 1; short b = 2; int c = a - b; c = c >> 4; printf("c = %d\n", c); c = c * -1 * 16 >> 4; printf("c = %d\n", c); printf("c = %d\n", 16 << 2); return 0; }
下面為輸出結果:
小結論
正數符號位為0,右移運算時,高位補0,低位移除
負數符號位為1,右移運算時,高位補1,低位移除
左移運算時,最高位移除,低位補0
最高位的具體位置,由數據類型決定
類型補充小知識
char 字符型,一個字節的整型,范圍[-128,127]
字符數據(單引號括起來的字符)的本質是整型數
char類型的變量可以打印為整數或者字符
再看一段代碼:
#include <stdio.h> int main() { char c = 'A'; short a = c; int b = c; printf("c = %c\n", c); printf("c = %d\n", c); printf("a = %d\n", a); printf("b = %d\n", b); c = 0x40; printf("c = %x\n", c); printf("c = %d\n", c); c = c << 1; printf("c = %d\n", c); c = c << 1; printf("c = %d\n", c); return 0; }
下面為輸出結果:
需要注意的是,因為c為char類型,所以64左移1位后,用二進制表示為1000 0000,最高位的1表示符號位,所以就是-128。
小結
不同類型的本質區別是:占用內存不同,數據表示不同
右移運算時,高位補符號位,低位移除
char是只占用一個字節的整型,可表示英文字符
數據符號位的具體位置由數據類型決定
關于“C語言中的運算類型有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。