C語言零基礎教程之運算符和表達式,全面解析,輕松上手
運算符和表達式
運算符:運算符用于執(zhí)行程序代碼運算,會針對一個以上操作數(shù)來進行運算。例如:2+3,其操作數(shù)是2和3,而運算符則是“+”
操作數(shù):是運算符作用于的實體,操作數(shù)指出指令執(zhí)行的操作所需要數(shù)據(jù)的來源。
表達式:是由數(shù)字、運算符、數(shù)字分組符號(括號)、自由變量等以能求得數(shù)值的有意義排列方法所得的組合。
表達式書寫規(guī)則
1,運算符不能相鄰。例a+-b是錯誤的
2,乘號不能省略。列x乘以y,應寫成x*y,而不是xy
3,可用多層括號表示運算次序,括號必須成對出現(xiàn),均使用小括號。
運算符優(yōu)先級和結合性
所謂優(yōu)先級就是當一個表達式中有多個運算符時,先計算誰,后計算誰。這個其實我們在小學學算術的時候就學過,如1+4÷2
那么“結合性”是什么呢?優(yōu)先級都是關于優(yōu)先級不同的運算符參與運算時先計算誰后計算誰。但是如果運算符的優(yōu)先級相同,那么先計算誰后計算誰呢?這個就是由“結合性”決定的。
比如1+2×3÷4,乘和除的優(yōu)先級相同,但是計算的時候是從左往右,即先計算乘再計算除,所以乘和除的結合性就是從左往右。就是這么簡單!
運算符分類
按所需操作數(shù)分類:
- 單目運算符
- 雙目運算符
- 三目運算符
按作用分類:
算術運算符
單目正負不會改變操作數(shù)的值。 int num = 10;
-num;//表達式的值為-10 num還是為10
整數(shù)相除會向下取整。 5/2 == 2
5/2.0 == 2.5
取模運算只針對整數(shù)。 5%2 == 1
5.2%2//語法錯誤
賦值運算符
將一個數(shù)據(jù)(常量或表達式)賦值給一個變量。 int age =18;
age +=2;//age = age +2;
age +=5-3;//age = age+(5-3);
關系運算符
- 關系表達式的值只有2種,為真(true)返回1,為假(false)返回0。
- 所謂關系運算,就是做比較,日常生活中經(jīng)常遇到一些真假判斷,比如說,“張三比李四高”、“濟南到北京比濟南到上海近”,“5大于2”這些問題的答案是真或假。程序設計是對實際問題解決過程的模擬,常常需要做判斷,像“如果這樣,我就執(zhí)行動作A,如果那樣,我就執(zhí)行動作B”,那怎么判斷這樣那樣呢,就需要關系運算符和關系表達式。
邏輯運算符
- 邏輯表達式的值只有2種,為真(true)返回1,為假(false)返回0。
- 一般用來連接關系表達式。
短路現(xiàn)象
在由&&和||運算符組成的邏輯表達式中,C語言有個“節(jié)省計算”原則,當計算出一個子表達式的值后便可確定整個邏輯表達式的值時,后面的子表達式就不需要再計算了,這種表達式也稱為短路表達式。
舉個例子:
- false && printf("1\n");
- true && printf("2\n");
- false || printf("3\n");
- true || printf("4\n");
- //output :2
- // 3
對于&&符號,如果左邊表達式為false,則右邊表達式不會執(zhí)行,即不會執(zhí)行printf(“1”),如果左邊表達式為true,則右邊表達式會執(zhí)行,即會執(zhí)行printf(“2”),輸出2
對于||符號,如果左邊為true,則右邊表達式不會執(zhí)行,即不會執(zhí)行printf("4"),如果左邊表達式為false,則右邊表達式會執(zhí)行,即執(zhí)行printf("3"),輸出3。
特殊運算符
特殊算術運算符
- 對變量進行+1和-1的操作。
- 只能對變量使用,不能用于常量和表達式
- 前置時是先運算、后使用
- 后置時是先使用、后運算
- 注意:不要嵌套使用
- int a = 1;
- printf("%d", (a++ + ++a)); //1 + 3
逗號運算符
用逗號將多個表達式連接起來,又稱為“順序求值運算符”。整個表達式的值是最后那個逗號之后表達式的值。
逗號表達式兩種作用:
- 分割: int a,b,c,d;
- 求值: int a = (1,3,5,7,9);
int b = 1,3,5,7,9;
條件表達式
條件表達式可以對指定的條件進行判斷,true和false分別執(zhí)行不同的代碼。
條件 ?表達式1 :表達式2
- printf(5 > 0 ? "正數(shù)" : "負數(shù)");
- printf((5 > 0) ? ("正數(shù)") : ("負數(shù)"));//為了避免眼花繚亂,可以把每個表達式都加上圓括號
位運算符
- 位運算只針對整型和字符型,而且是直接對二進制進行操作
按位與&
這個符號其實和邏輯與運算 && 意思一樣,只不過作用在每一位上。
有0則0:對于每一位來說,兩個數(shù)都是真,則為真,否則為假。
- 3-> 0b 0000 0011
- 2-> 0b 0000 0010
- 3&2 ->0b 0000 0010
按位或|
同理,和邏輯或運算 || 意思一樣,只不過作用在每一位上。
有1則1:對于每一位來說,但凡有個真的就是真,否則為假。
- 3-> 0b 0000 0011
- 2-> 0b 0000 0010
- 3|2 ->0b 0000 0011
按位異或^
相同為0,不同為1:對于每一位來說,只要相同就為0,不同就為1。
- 3-> 0b 0000 0011
- 2-> 0b 0000 0010
- 3^2 ->0b 0000 0001
按位取反
取反是一個單目運算符,對每一位進行取反,即0變1,1變0
- 6-> 0b 0000 0110
- ~6-> 0b 1111 1001 //補碼:最高位變成了符號位,所以結果肯定是一個負數(shù)
- 0b 1000 0110 //反碼
- 0b 1000 0111 //原碼
- result: -7
左移
左移操作就是把這些0啊1啊的整體往左移動 n 位,右邊缺的就補充 0。
- 3-> 0b 0000 0011
- 3<<1 -> 0b 0000 0110 ==6
- 2-> 0b 0000 0010
- 2<<2 0b 0000 1000 == 8
誒,大家發(fā)現(xiàn)沒有,左移 1 位之后這個數(shù)相當于乘2。
但是這只適用于左邊溢出的高位中不包含 1 時。
如果把 1 扔了,那就肯定不是 2 倍了嘛。
右移
右移操作就是整體往右移動 n 位,左邊缺的補充符號位。
- 3-> 0b 0000 0011
- 3>>1 -> 0b 0000 0001 ==1
- 2-> 0b 0000 0010
- 2<<2 0b 0000 0001 == 1
同理,正數(shù)右移操作的效果是這個數(shù)除以 2。
最后
好了,C語言運算符和表達式就介紹到這里,大家可以先練習一下,后面介紹復雜的示例。