C語言中的賦值運算子



在C語言中,賦值運算子將某個值儲存到已宣告的變數中。C語言中的變數可以賦值字面量、另一個變數或表示式的值。

要賦值的值構成右運算元,而要賦值的變數應該是“=”符號左邊的運算元,“=”符號在C語言中定義為簡單的賦值運算子。

此外,C語言還有幾種增強型賦值運算子。

下表列出了C語言支援的賦值運算子:

運算子 描述 示例
= 簡單的賦值運算子。將右運算元的值賦給左運算元。 C = A + B 將 A + B 的值賦給 C
+= 加法賦值運算子。它將右運算元加到左運算元上,並將結果賦給左運算元。 C += A 等效於 C = C + A
-= 減法賦值運算子。它從左運算元中減去右運算元,並將結果賦給左運算元。 C -= A 等效於 C = C - A
*= 乘法賦值運算子。它將右運算元乘以左運算元,並將結果賦給左運算元。 C *= A 等效於 C = C * A
/= 除法賦值運算子。它將左運算元除以右運算元,並將結果賦給左運算元。 C /= A 等效於 C = C / A
%= 取模賦值運算子。它使用兩個運算元進行取模運算,並將結果賦給左運算元。 C %= A 等效於 C = C % A
<<= 左移賦值運算子。 C <<= 2 等效於 C = C << 2
>>= 右移賦值運算子。 C >>= 2 等效於 C = C >> 2
&= 按位與賦值運算子。 C &= 2 等效於 C = C & 2
^= 按位異或賦值運算子。 C ^= 2 等效於 C = C ^ 2
|= 按位或賦值運算子。 C |= 2 等效於 C = C | 2

簡單的賦值運算子 (=)

= 運算子是 C 語言中最常用的運算子之一。根據 ANSI C 標準,所有變數都必須在開頭宣告。不允許在第一個處理語句之後宣告變數。

您可以宣告一個變數,稍後在程式碼中為其賦值,或者在宣告時對其進行初始化。

您可以在賦值語句中使用字面量、另一個變數或表示式。

int x = 10; // declaration with initialization
int y;      // declaration
y = 20;     // assignment later
int z = x + y; // assign an expression
int d = 3, f = 5; // definition and initializing d and f. 
char x = 'x'; // the variable x has the value 'x'.

一旦聲明瞭某種型別的變數,就不能再為其賦值其他型別的變數。在這種情況下,C 編譯器會報告型別不匹配錯誤。

在 C 語言中,引用記憶體位置的表示式稱為“左值”表示式。左值可以出現在賦值的左邊或右邊。

另一方面,術語右值指的是儲存在記憶體某個地址中的資料值。右值是一個不能為其賦值的表示式,這意味著右值可以出現在賦值的右邊,但不能出現在左邊。

變數是左值,因此可以出現在賦值的左邊。數字字面量是右值,因此不能賦值,也不能出現在左邊。請看以下有效和無效的語句:

int g = 20; // valid statement
10 = 20;    // invalid statement

增強型賦值運算子

除了=運算子之外,C語言還允許您將算術運算子和位運算子與=符號組合起來,形成增強型或複合賦值運算子。增強型運算子提供了一種方便的快捷方式,用於將算術運算或位運算與賦值結合起來。

示例 1

例如,表示式“a += b”具有相同的執行效果:先執行“a + b”,然後將結果賦值回變數“a”。

#include <stdio.h>

int main(){

   int a = 10;
   int b = 20;
   
   a += b;
   printf("a: %d", a);
   
   return 0;
}

輸出

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

a: 30

示例 2

類似地,表示式“a <<= b”具有相同的執行效果:先執行“a << b”,然後將結果賦值回變數“a”。

#include <stdio.h>

int main(){

   int a = 60;
   int b = 2;
   
   a <<= b;
   printf("a: %d", a);
   
   return 0;
}

輸出

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

a: 240

示例 3

這是一個演示C語言中賦值運算子用法的C程式:

#include <stdio.h>

int main(){

   int a = 21;
   int c ;

   c =  a;
   printf("Line 1 - =  Operator Example, Value of c = %d\n", c );

   c +=  a;
   printf("Line 2 - += Operator Example, Value of c = %d\n", c );

   c -=  a;
   printf("Line 3 - -= Operator Example, Value of c = %d\n", c );

   c *=  a;
   printf("Line 4 - *= Operator Example, Value of c = %d\n", c );

   c /=  a;
   printf("Line 5 - /= Operator Example, Value of c = %d\n", c );

   c  = 200;
   c %=  a;
   printf("Line 6 - %%= Operator Example, Value of c = %d\n", c );

   c <<=  2;
   printf("Line 7 - <<= Operator Example, Value of c = %d\n", c );

   c >>=  2;
   printf("Line 8 - >>= Operator Example, Value of c = %d\n", c );

   c &=  2;
   printf("Line 9 - &= Operator Example, Value of c = %d\n", c );

   c ^=  2;
   printf("Line 10 - ^= Operator Example, Value of c = %d\n", c );

   c |=  2;
   printf("Line 11 - |= Operator Example, Value of c = %d\n", c );
   
   return 0;
}

輸出

編譯並執行上述程式時,將產生以下結果:

Line 1 - =  Operator Example, Value of c = 21
Line 2 - += Operator Example, Value of c = 42
Line 3 - -= Operator Example, Value of c = 21
Line 4 - *= Operator Example, Value of c = 441
Line 5 - /= Operator Example, Value of c = 21
Line 6 - %= Operator Example, Value of c = 11
Line 7 - <<= Operator Example, Value of c = 44
Line 8 - >>= Operator Example, Value of c = 11
Line 9 - &= Operator Example, Value of c = 2
Line 10 - ^= Operator Example, Value of c = 0
Line 11 - |= Operator Example, Value of c = 2
c_operators.htm
廣告