當我們宣告了一個int
整數的變數x
並賦值為38,那它在記體中的樣子如下圖所示:
x
是儲存於記憶體位址中的0x7ffda99fcbdc-0x7ffda99fcbdf4Bytes
),符合我們的認知。現在我們知道變數在記體中的樣子了,我們接下來想要對變數做一些運算。
作用:用於將值指定給變數。
=
, +=
, =
, =
, /=
, %=
int a = 10; // 將 10 指定給 a
a += 5; // 相當於 a = a + 5 (結果: 15)
+
, -
, *
, /
, %
int a = 10, b = 3;
int sum = a + b; // 加法 (結果: 13)
int mod = a % b; // 取餘數 (結果: 1)
++
(遞增),--
(遞減)c
int n=0, a = 5;
n = (a++) + 10; // 後置遞增,會先計算a + 10, 再計算a = a + 1(結果: n=15, a=6)
n = (++a) + 10; // 前置遞增,會先計算a = a + 1, 再計算a + 10(結果: a=7, n=17)
true
或 false
)。==
, !=
, <
, >
, <=
, >=
int a = 5, b = 10;
if (a < b) { // 比較 (結果: true)
printf("a 小於 b\n");
}
&&
(AND), ||
(OR), !
(NOT)int a = 5, b = 10;
if (a > 0 && b > 0) { // AND 運算 (結果: true && true = true)
printf("a 和 b 都是正數\n");
}
&
(AND), |
(OR), ^
(XOR), ~
(NOT), <<
(左移), >>
(右移)int a = 8, b = 2, c=0;
//把a的位元右移b個位元,並將移出的位元捨棄,空缺則補0,相當於a / 2的b次方, 結果為00000000 00000000 00000000 00000010,c=2
c = a>>b;
//把a的位元左移b個位元,並將移出的位元捨棄,空缺則補0,相當於a * 2的b次方, 結果為00000000 00000000 00000000 00100000,c=32
c = a<<b;
c = ~a; //把a的每一位元NOT,即將0變為1,1變為0,結果為11111111 11111111 11111111 11110111,最高位為負號,表示負數,我們對結果取2的補數就可以得到這個負數的數值,我們得到-(00000000 00000000 00000000 00001000+1),c=-9
c = a&b; //結果為: 00000000 00000000 00000000 00000000,c = 0
c = a|b; //結果為:00000000 00000000 00000000 00001010,c = 10
c = a^b; //結果為:00000000 00000000 00000000 00001010,c = 10
char x = 3;
x = ~x;
(a)//x取反向: 11111100
(b)//取2的補數: 得到-(00000100)
(c)//x = -4
char x = -3;
x = x >> 1;
(a)//-3以2的補數表示為11111101(00000011反相+1)
(b)//右移後得到11111110(注意,因為最高位為負號,這邊我們不補0,要補1)
(c)//取2的補數,得到-(00000010)
(d)//x = -2
條件 ? 真值 : 假值
int a = 5, b = 10;
int max = (a > b) ? a : b; // 若條件為真返回 a,否則返回 b (結果: max=10)
在程式碼中,優先級較高,意味著它們會先被執行。
一樣不用死記硬背,但有時候優先級的高低可能會影響輸出結果,所以大概了解一些優先級大概在哪還是有其必要性,不過忘記回來查就好了。