C語言運算子優先順序



C語言中的單個表示式可能包含多種不同型別的運算子。C編譯器根據運算子的優先順序和結合性來評估其值。

運算子的優先順序決定了它們在表示式中計算的順序。優先順序較高的運算子先計算。

例如,請看以下表達式:

x = 7 + 3 * 2; 

這裡,乘法運算子“*”的優先順序高於加法運算子“+”。因此,首先執行乘法 3*2,然後將其結果加到 7 中,最終結果為“x = 13”。

下表列出了C語言中運算子的優先順序順序。這裡,優先順序最高的運算子位於表的上方,優先順序最低的運算子位於表的下方。

類別 運算子 結合性
字尾 () [] -> . ++ - - 從左到右
一元 + - ! ~ ++ -- (type)* & sizeof 從右到左
乘法 * / % 從左到右
加法 + - 從左到右
移位 << >> 從左到右
關係 < <= > >= 從左到右
相等 == != 從左到右
按位與 & 從左到右
按位異或 ^ 從左到右
按位或 | 從左到右
邏輯與 && 從左到右
邏輯或 || 從左到右
條件 ?: 從右到左
賦值 = += -= *= /= %=>>= <<= &= ^= |= 從右到左
逗號 , 從左到右

在表示式中,優先順序較高的運算子將首先計算。

運算子結合性

在C語言中,運算子的結合性指的是在程式中表達式計算的方向(從左到右或從右到左)。當兩個具有相同優先順序的運算子出現在表示式中時,就會用到運算子的結合性。

在下面的示例中:

15 / 5 * 2

“/”(除法)和“*”(乘法)運算子具有相同的優先順序,因此計算順序將由結合性決定。

根據上表,乘法運算子的結合性是從左到右。因此,表示式將按以下方式計算:

(15 / 5) * 2

計算結果為:

3 * 2 = 6

示例 1

在以下程式碼中,乘法和除法運算子的優先順序高於加法運算子。

乘法運算子的從左到右結合性導致“b”和“c”相乘再除以“e”。然後將結果加到“a”的值上。

#include <stdio.h>

int main(){

   int a = 20;
   int b = 10;
   int c = 15;
   int d = 5;
   
   int e;
   e = a + b * c / d;     
   printf("e : %d\n" ,  e );
  
   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

e: 50

示例 2

我們可以使用括號來更改計算順序。括號 () 在所有 C 運算子中具有最高優先順序。

#include <stdio.h>

int main(){

   int a = 20;
   int b = 10;
   int c = 15;
   int d = 5;
   int e;

   e = (a + b) * c / d;     
   printf("e:  %d\n",  e);
   
   return 0;
}

輸出

執行程式碼並檢查其輸出:

e: 90

在這個表示式中,首先計算括號中的 a 和 b 的加法。結果乘以 c,然後除以 d。

示例 3

在計算 e 的表示式中,我們將 a+b 放到一個括號中,將 c/d 放到另一個括號中,並將兩個結果相乘。

#include <stdio.h>

int main(){

   int a = 20;
   int b = 10;
   int c = 15;
   int d = 5;

   int e;
   e = (a + b) * (c / d);   
   printf("e: %d\n",  e );

   return 0;
}

輸出

執行此程式碼後,您將獲得以下輸出:

e: 90

字尾/字首自增/自減運算子的優先順序

“++”和“--”運算子分別充當自增和自減運算子。它們本質上是一元的,可以作為變數的字首或字尾使用。

當單獨使用時,以字首或字尾方式使用這些運算子具有相同的效果。換句話說,“a++”與“++a”具有相同的效果。但是,當這些“++”或“--”運算子與表示式中的其他運算子一起出現時,它們的行為會有所不同。

字尾自增和自減運算子的優先順序高於字首自增和自減運算子。

示例

以下示例展示瞭如何在 C 程式中使用自增和自減運算子:

#include <stdio.h>

int main(){

   int x = 5, y = 5, z;
   printf("x: %d \n", x);

   z = x++;
   printf("Postfix increment: x: %d z: %d\n", x, z);

   z = ++y;
   printf("Prefix increment. y: %d z: %d\n", y ,z);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

x: 5 
Postfix increment: x: 6 z: 5
Prefix increment. y: 6 z: 6

邏輯運算子具有從左到右的結合性。但是,編譯器會評估確定表示式結果所需的最小運算元。因此,表示式的某些運算元可能不會被評估。

例如,請看以下表達式:

x > 50 && y > 50

這裡,第二個運算元“y > 50”僅在第一個表示式計算結果為真時才會被評估。

c_operators.htm
廣告