賦值運算符(=)是 C 語言中最基礎也最常用的運算符之一。它將右側表達式的值計算後存入左側變量,形成「賦值表達式」,其值即為賦值後左側變量的值。得益於右結合性,a = b = c = 5 等價於 a = (b = (c = 5)),依次將 5 賦予 c、b、a。
與其他高級語言將賦值視為「語句」不同,C 語言將 = 定義為運算符,使得賦值表達式可出現在任何表達式合法的位置。例如:
x = (a = 5) + (b = 8); // 合法:先賦值 a=5, b=8,再相加得 13 賦予 x
若在表達式後加分號,即構成「賦值語句」(如 x = 8;),這是日常編程的主流形式。
當賦值號兩側數據類型不同時,編譯器自動將右側值轉換為左側類型,遵循以下規則:
| 右側類型 | 左側類型 | 轉換行為 |
|---|---|---|
| 浮點型 | 整型 | 捨去小數部分(截斷,非四捨五入) |
| 整型 | 浮點型 | 數值不變,以浮點形式存儲(補 .0) |
| 字符型 | 整型 | 將 ASCII 碼存入整型低位,高位補 0 |
| 整型 | 字符型 | 僅保留低 8 位 |
#include <stdio.h>
int main(void) {
int a, c, b = 322;
float x, y = 8.88;
char c1 = 'k', c2;
a = y; // float → int:a = 8
x = b; // int → float:x = 322.000000
c = c1; // char → int:c = 107 ('k' 的 ASCII)
c2 = b; // int → char:取低 8 位 0x42 → 'B'
printf("a=%d, x=%f, c=%d, c2=%c\n", a, x, c, c2);
// 輸出:a=8, x=322.000000, c=107, c2=B
return 0;
}
將二元算術/位運算符與 = 結合,形成 +=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。其語義等價於:
變量 op= 表達式 ⇔ 變量 = 變量 op (表達式)
注意:x *= y + 7 等價於 x = x * (y + 7),而非 x = x * y + 7。復合賦值不僅簡潔,亦有助於編譯器生成更高效的目標代碼。
double → int、long → char)可能導致數據丟失,編譯器通常給出警告,需顯式轉型確認意圖。a = b = c = 5 僅適用於類型相容的變量鏈;類型不同時,中間轉換可能產生非預期結果。arr[i++] += 1)行為與展開形式不同。