這道題目揭示了 逗號運算符 與 函數參數列表 中逗號的本質區別。
// 程序 1:括號包裹的逗號表達式
#include <stdio.h>
void main() {
int a=4, b=7;
printf("%d\n", (a=a+1, b+a, b+1));
}
// 程序 2:直接作為參數列表
#include <stdio.h>
void main() {
int a=4, b=7;
printf("%d\n", a=a+1, b+a, b+1);
}
printf("%d\n", (a=a+1, b+a, b+1));
a=a+1 (a=5) → b+a (7+5=12,值丟棄) → b+1 (8)printf("%d\n", a=a+1, b+a, b+1);
"%d\n" 只有一個 %d,只消費第一個參數a=a+1 值為 5(賦值表達式的值為賦值後的值)b+a、b+1 被忽略(編譯器可能警告)| 場景 | 逗號含義 | 求值結果 |
|---|---|---|
表達式中 (expr1, expr2, expr3) | 逗號運算符 | 依次求值,返回最後表達式的值 |
函數調用 func(arg1, arg2, arg3) | 參數分隔符 | 傳遞三個獨立參數 |
變量聲明 int a=1, b=2; | 聲明分隔符 | 聲明多個變量 |
-Wall -Wextra),捕獲參數過多/格式不匹配問題