5.3 挑幾個運算符來講
常用的運算符除了加減乘除(+-*/)外,還有如下:
注意:以下運算符之間用逗号隔開,C語言中也有逗号運算符,這裡不講逗号運算符。
1. 指派運算符 =,+=,*=
2. 一進制運算符 ++, --
3. 相等運算符 ==,!= ,關系運算符 < ,>,<=,>=
4. 條件運算符 ?:
6. 位運算符 &, ^, | ,! 邏輯運算符 &&, ||, 移位運算符 >>, <<
5.3.1 指派運算符
給變量指派,可以通過“=”連接配接,将右邊的數值指派給左邊的變量,如:
int a = 10;
int b;
b = 10;
指派運算符中還能夠做加減乘除與或非等等的運算,如:
#include <stdio.h>
void main()
{
int a = 10;
a += 100;
printf("a = %d \n", a);
}
運作結果為:a = 110;
上述a += 100 等價于 a = a + 100; 以此類推, a -= 100 等價于 a = a - 100; a *= 100; 等價于 a = a * 100 ......後續講到的&,^,| 等位運算符也能結合“=”湊合着來使用。
5.3.2 一進制運算符,增增,減減
C語言中一進制運算符,有加加++和減減--,但是沒有乘乘**和除除//。因為++的意思是變量加一,--的意思是變量減1,是以沒有必要**和//,因為變量乘以1和除以1都是等于變量本身。
因為++和--的意思類似,是以就挑++來講解。
++可以放在變量前面,也可以放在變量後面,意思不同,寫法如下:
int a = 10;
++a;
a++;
++a是先進行自增1的運算,然後進行其它的操作,a++是先進行其它操作,然後再進行自增1的運算,這麼說不好了解,如下代碼:
#include <stdio.h>
void main()
{
int a = 0;
int b = 10;
a = ++b;
printf("a = %d b = %d\n", a, b);
}
運作結果是:a = 11 b = 11; 代碼中,a在變量聲明的時候指派為0,b指派為10,在運算表達式中,a = ++b; 先進行b的自增運算,這時候b就變為了10+1 = 11,然後指派給a,a的取值就變為11了,再看下一段代碼:
#include <stdio.h>
void main()
{
int a = 0;
int b = 10;
a = b++;
printf("a = %d b = %d\n", a, b);
}
運作的結果是:a = 10 b = 11;代碼中,a在變量聲明的時候指派為0,b指派為10,在運算表達式中,a = b++;先進行a = b 的指派運算,然後再進行b = b + 1 的自增運算,是以a的取值就是10,b的取值為11。
如果++b和b++是完整的一句表達式,
注意:完整的一句表達式以分号;作為為這句結束的辨別。
也就是,
#include <stdio.h>
void main()
{
int a = 0;
++a;
printf("a = %d\n", a);
}
和
#include <stdio.h>
void main()
{
int a = 0;
a++;
printf("a = %d\n", a);
}
它們的運作結果是一緻的,因為完整的一句表達式中,沒有其它的操作,是以就隻做了自增1的操作。是以請記住:++a是先進行自增1的運算,然後進行其它的操作,a++是先進行其它操作,然後再進行自增1的運算
熟悉了以上概念就可以思考以下結果:
int a, b, c, d,e, f, g, h;
a = 10;
b = (a++) + (a++) + (a++);
a = 10;
c = (++a)+ (++a) + (++a);
a = 10;
d = (++a) + (a++) + (a++);
a = 10;
e = (a--) + (a--) + (a--);
a = 10;
f = (--a)+ (--a) + (--a);
a = 10;
g = (--a) + (a--) + (a--);
a = 10;
h = (a--) - (a++) + (++a) - (--a);
請問b,c,d,e,f,g,h的取值為多少?不了解的話可以再次回顧剛才的概念,然後加printf語句來核對結果。
5.3.3 和bool值有關的相等運算符與關系運算符
第四章的時候有講過一種資料類型叫做 bool,它的取值就兩種,true,false。計算機語言是二進制,記憶體中,true等于1,false等于0,如以下代碼,
#include <stdio.h>
#include <stdbool.h>
void main()
{
printf("%d , %d \n", true, false);
}
運作結果為 1 , 0;是以更加清晰的了解了,真true的值為1,假false的值為0。
注意:需要聲明頭檔案 stdbool.h 才可以使用 bool 變量,才可以列印 true 和 false 的值。
有了以上概念,就可以了解相等運算符的取值了,比如兩個等于号 == ,意思為這兩個取值是否相等,是的話運算結果值為1,不是的話運算結果值為0。
注意:千萬不要把指派運算符 = 與相等運算符 == 混淆了!後續講解條件語句會再提到這點。
感歎号加上等号 != ,意思為這兩個值是否不相等,是的話運算結果值為1,不是的話運算結果值為0。代碼如下:
#include <stdio.h>
#include <stdbool.h>
void main()
{
int a = 10;
int b = 5;
bool c;
c = (a == b);
printf("c = %d \n", c);
}
運作結果為,c = 0;是以c的值就說明了 a == b 是假,也就是 a 和 b 相等是不成立的。
注意:讀者可以自行改代碼,把 b = 5 改為 b = 10 ,就能發現,c的值變為1了,說明這時 a 等于 b 成立。
把代碼稍微修改一下,把 a == b 改為, a != b 如下:
#include <stdio.h>
#include <stdbool.h>
void main()
{
int a = 10;
int b = 5;
bool c;
c = (a != b);
printf("c = %d \n", c);
}
運作結果為,c = 1;說明 a 不等于 b 是成立的,是以運算結果值取1。
同理,小于号 < 取運算結果,左邊是否小于右邊,是的話運算結果值取1,否的話運算結果值取0;
小于等于号 <= ,大于号 > ,大于等于号 >= 也都是這樣的用法。
5.3.4 條件運算符
問号加上冒号就組成了條件運算符的表示 ?: ,使用方式一般套用以下格式:
條件 ? 表達式1 : 表達式2
條件其實也是一種表達式,隻不過條件的取值是 bool 值,如果取值是true(1),運算表達式1,如果取值是false (0),運算表達式2,代碼如下,
#include <stdio.h>
#include <stdbool.h>
void main()
{
int a = 10;
int b = 5;
(a > b) ? (++a) : (++b);
printf("a = %d, b = %d\n", a, b);
}
運作結果為:a = 11, b = 5; 在表達式 (a > b) ? (++a) : (++b); 中, 先判斷 a 是否大于 b,結果是大于,是以選擇問号後面的表達式 ++a 來運算。
後續講到宏定義的時候會再次涉及條件運算符做個小功能,這裡mark一下。