題目選項分析
| 選項 | 代碼 | 合法性 | 解析 |
| A | a += 7 | ✅ 合法 | 復合賦值,等價 a = a + 7,右結合,a 為左值 |
| B | b + c = a = 7 | ❌ 非法 | b+c 為右值 (暫時值),不可作左值賦值目標 |
| C | int 18.5 % 3 | ❌ 非法 | % 要求**整數運算元**,18.5 為浮點常量;且 int 為關鍵字不可作標識符 |
| D | a = a + 7 = c + b | ❌ 非法 | a+7 為右值,不可賦值;鏈式賦值右結合但每個 = 左側必須為左值 |
核心規則總結
- 左值 (Lvalue):表達式標識對象,**可取地址**、可出現在賦值左側 (變量、解引用指釖、陣列元素)。
- 右值 (Rvalue):臨時值、字面常量、算術表達式結果,**不可賦值**。
- 賦值運算符
=`:右結合,要求左側為左值,返回左值 (C 語言特有,C++ 返回左值引用)。
- 復合賦值
+=` 等:同樣要求左側為左值,僅求值一次左側表達式。
- 取模
%:**雙邊運算元必為整數類型** (含 char/short/int/long),浮點數用 fmod。
類似考點練習
// 下列何者合法?
1. x = y = z = 10; // ✅ 合法,右結合,z=10 返回 z 左值,依次賦值
2. (a > b) ? a : b = 20; // ❌ 非法,三元優先級高於 =,解析為 (a>b?a:b)=20,結果為右值
3. (a > b) ? a : (b = 20); // ✅ 合法,括號強制 b=20 為三元第三操作數
4. *p++ = 5; // ✅ 合法,*p++ 解析為 *(p++),返回左值
5. 3 + 4 = 7; // ❌ 非法,3+4 為右值