在 C 語言中,若禁用算術運算符實現兩數相加,常規思路是位運算模擬全加器。但標準庫函數 `printf` 的特殊副作用——返回輸出字符總數,配合格式控制符的動態寬度特性,能構造出一個極其巧妙的「零運算符加法器」。
#include <stdio.h>
int main() {
int a = 9;
int b = 3;
// 輸出 a+b 個空格,printf 返回輸出字符數 = a+b
printf("%d\n", printf("%*s%*s", a, "", b, ""));
return 0;
}
12 ← 輸出 12 個空格 (肉眼不可見)
12 ← 外層 printf 打印內層返回值 12
格式串 `%*s` 中:
* 表示**寬度由對應參數提供** (而非寫死在格式串)s 表示輸出字符串參數""效果: `printf("%*s", a, "")` → 輸出 **a 個空格** (寬度 a,內容為空,左補空格)。
printf("%*s%*s", a, "", b, "");
// 等效於:
printf("%*s", a, ""); // 輸出 a 個空格
printf("%*s", b, ""); // 緊接輸出 b 個空格
// 總共輸出 a+b 個空格
`printf` 返回成功輸出的字符總數 (負值表示輸出錯誤)。
內層 `printf` 輸出 `a+b` 個空格 → 返回 `a+b`。外層 `printf("%d\n", ...)` 打印該返回值。
printf("%d\n", printf("%*s%*s", a, "", b, "") );
▲ ▲
│ └─ 先執行:輸出 a+b 空格,返回 a+b
└─ 後執行:打印返回值 a+b 並換行
| 操作 | 是否算術運算符 | 說明 |
|---|---|---|
| 變量賦值 `=` | 否 | 賦值運算符,允許 |
| 函數調用 `()` | 否 | 後綴運算符,允許 |
| 格式串 `%*s` | 否 | 格式控制,非運算符 |
| 參數傳遞 `,` | 否 | 分隔符,非運算符 |
| 返回值傳遞 | 否 | 表達式求值規則 |