C語言符號優先級詳細解析
在C語言中,不同的運算符具有不同的優先級和結合性,這決定了在表達式中運算符的計算順序。理解這些優先級和結合性是正確編寫和理解C語言程序的基礎。本文將詳細解析C語言中的符號優先級,包括各類運算符的優先級、結合性及其應用示例。
在 評論 區對文章做出評價,博主免費贈送 最新2024版本C語言ISO/IEC國際標準
。
1. 運算符優先級表
下表列出了C語言中各類運算符的優先級和結合性,從高到低排列:
優先級 | 運算符 | 描述 | 結合性 |
---|---|---|---|
1 | () | 小括號 | 左到右 |
[] | 數組下標 | 左到右 | |
. | 成員選擇 | 左到右 | |
-> | 成員選擇(通過指針) | 左到右 | |
2 | ++ | 后置遞增 | 左到右 |
-- | 后置遞減 | 左到右 | |
3 | ++ | 前置遞增 | 右到左 |
-- | 前置遞減 | 右到左 | |
+ | 正號 | 右到左 | |
- | 負號 | 右到左 | |
! | 邏輯非 | 右到左 | |
~ | 按位取反 | 右到左 | |
* | 指針解引用 | 右到左 | |
& | 取地址 | 右到左 | |
(type) | 類型轉換 | 右到左 | |
sizeof | 取大小 | 右到左 | |
4 | * | 乘法 | 左到右 |
/ | 除法 | 左到右 | |
% | 取模 | 左到右 | |
5 | + | 加法 | 左到右 |
- | 減法 | 左到右 | |
6 | << | 左移 | 左到右 |
>> | 右移 | 左到右 | |
7 | < | 小于 | 左到右 |
<= | 小于等于 | 左到右 | |
> | 大于 | 左到右 | |
>= | 大于等于 | 左到右 | |
8 | == | 等于 | 左到右 |
!= | 不等于 | 左到右 | |
9 | & | 按位與 | 左到右 |
10 | ^ | 按位異或 | 左到右 |
11 | ` | ` | 按位或 |
12 | && | 邏輯與 | 左到右 |
13 | ` | ` | |
14 | ? : | 條件運算符 | 右到左 |
15 | = | 賦值 | 右到左 |
+= | 加賦值 | 右到左 | |
-= | 減賦值 | 右到左 | |
*= | 乘賦值 | 右到左 | |
/= | 除賦值 | 右到左 | |
%= | 模賦值 | 右到左 | |
<<= | 左移賦值 | 右到左 | |
>>= | 右移賦值 | 右到左 | |
&= | 按位與賦值 | 右到左 | |
^= | 按位異或賦值 | 右到左 | |
` | =` | 按位或賦值 | |
16 | , | 逗號 | 左到右 |
2. 優先級和結合性詳解
2.1 括號運算符 ()
, []
, .
, ->
這些運算符的優先級最高,用于函數調用、數組下標訪問、結構體成員訪問。
int arr[3] = {1, 2, 3};
printf("%d\n", arr[0]); // 輸出: 1
2.2 遞增遞減運算符 ++
, --
分為前置和后置遞增、遞減運算符。前置運算符優先級高于后置運算符。
int a = 5;
printf("%d\n", ++a); // 輸出: 6 (前置遞增,先增加后使用)
printf("%d\n", a++); // 輸出: 6 (后置遞增,先使用后增加)
2.3 一元運算符 +
, -
, !
, ~
, *
, &
, (type)
, sizeof
用于正負號、邏輯非、按位取反、指針解引用、取地址、類型轉換和取大小。
int a = -5;
int b = !a; // b的值為0 (邏輯非)
2.4 乘法、除法、取模運算符 *
, /
, %
用于基本的數學運算。
int a = 10;
int b = 3;
printf("%d\n", a * b); // 輸出: 30
printf("%d\n", a / b); // 輸出: 3
printf("%d\n", a % b); // 輸出: 1
2.5 加法和減法運算符 +
, -
用于基本的數學運算。
int a = 5;
int b = 3;
printf("%d\n", a + b); // 輸出: 8
printf("%d\n", a - b); // 輸出: 2
2.6 移位運算符 <<
, >>
用于按位左移和右移。
int a = 4; // 二進制: 100
int b = a << 1; // 左移1位: 1000 (8)
int c = a >> 1; // 右移1位: 10 (2)
printf("%d, %d\n", b, c); // 輸出: 8, 2
2.7 關系運算符 <
, <=
, >
, >=
用于比較操作。
int a = 5;
int b = 3;
printf("%d\n", a > b); // 輸出: 1 (true)
2.8 相等運算符 ==
, !=
用于判斷相等和不等。
int a = 5;
int b = 5;
printf("%d\n", a == b); // 輸出: 1 (true)
printf("%d\n", a != b); // 輸出: 0 (false)
2.9 按位運算符 &
, ^
, |
用于按位與、異或和或操作。
int a = 5; // 二進制: 101
int b = 3; // 二進制: 011
printf("%d\n", a & b); // 輸出: 1 (001)
printf("%d\n", a ^ b); // 輸出: 6 (110)
printf("%d\n", a | b); // 輸出: 7 (111)
2.10 邏輯運算符 &&
, ||
用于邏輯與和邏輯或操作。
int a = 1;
int b = 0;
printf("%d\n", a && b); // 輸出: 0 (false)
printf("%d\n", a || b); // 輸出: 1 (true)
2.11 條件運算符 ? :
用于條件表達式(三元運算符)。
int a = 5;
int b = 3;
int max = (a > b) ? a : b; // max的值為5
printf("%d\n", max); // 輸出: 5
2.12 賦值運算符 =
, +=
, -=
, *=
, /=
, %=
, <<=
, >>=
, &=
, ^=
, |=
用于賦值操作。
int a = 5;
a += 3; // a的值為8
a *= 2; // a的值為16
printf("%d\n", a); // 輸出: 16
2.13 逗號運算符 ,
用于分隔多個表達式,返回最后一個表達式的值。
int a = 1, b = 2, c;
c = (a += 2, b += 3, a + b); // a的值為3, b的值為5, c的值為8
printf("%d\n", c); // 輸出: 8
3. 優先級和結合性示例
為了更好地理解運算符的優先級和結合性,以下通過幾個示例進行說明。
示例1:結合性
int a = 5, b = 10, c = 15;
int result = a + b * c; // 優先級:先計算 b * c,結果為150,然后 a + 150,結果為155
printf("%d\n", result); // 輸出: 155
在這個例子中,乘法運算符 *
的優先級高于加法運算符 +
,因此先計算 b * c
,再計算 a + (b * c)
。
示例2:括號改變優先級
int a = 5, b = 10, c = 15;
int result = (a + b) * c; // 使用括號改變優先級,先計算 a + b,結果為15,然后 15 * c,結果為225
printf("%d\n", result); // 輸出: 225
在這個例子中,括號 ()
改變了計算順序,使得加法 a + b
先于乘法 *
被計算。
示例3:邏輯運算
int a = 1, b = 0, c = 1;
int result = a && b || c; // 優先級:先計算 a && b,結果為0,然后 0 || c,結果為1
printf("%d\n", result); // 輸出: 1
在這個例子中,邏輯與運算符 &&
的優先級高于邏輯或運算符 ||
,因此先計算 a && b
,再計算 0 || c
。
示例4:賦值運算結合性
int a, b, c;
a = b = c = 10; // 結合性:從右到左,先計算 c = 10,然后 b = c,最后 a = b
printf("%d %d %d\n", a, b, c); // 輸出: 10 10 10
在這個例子中,賦值運算符 =
的結合性是從右到左,因此先計算 c = 10
,再計算 b = c
,最后計算 a = b
。
4. 總結
理解C語言中的運算符優先級和結合性是編寫正確代碼的關鍵。本文詳細介紹了C語言中的各種運算符、它們的優先級和結合性,并通過示例展示了如何正確使用這些運算符。掌握這些知識,將有助于編寫出邏輯嚴謹、結構清晰的C語言程序。
6. 參考文獻
- Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
- ISO/IEC. (1999). ISO/IEC 9899:1999. Programming Languages – C.
- ISO/IEC. (2024). ISO/IEC DIS 9899. Programming Languages – C.
- Harbison, S. P., & Steele, G. L. (2002). C: A Reference Manual (5th ed.). Prentice Hall.
6. 結束語
- 本節內容已經全部介紹完畢,希望通過這篇文章,大家對C語言中的符號優先級有了更深入的理解和認識。
- 感謝各位的閱讀和支持,如果覺得這篇文章對你有幫助,請不要吝惜你的點贊和評論,這對我們非常重要。再次感謝大家的關注和支持!