>?= 與 <?=:最大值/最小值賦值的「喪心病狂」寫法GCC(及兼容編譯器如 Clang)作為擴展支持兩個非標準運算符:
a >?= b 等價於 if (b > a) a = b;(取最大值並賦值)a <?= b 等價於 if (b < a) a = b;(取最小值並賦值)#include <stdio.h>
int main() {
int a = 0, b = 6, c = 9;
a >?= b; // a = max(a, b) → 6
c >?= b; // c = max(c, b) → 9 (c 保持不變)
printf("%d %d\n", a, c); // 輸出: 6 9
return 0;
}
-std=gnu11 等 GNU 擴展模式a >?= func() 中 func() 可能被調用多次(宏展開語義),標準 fmax/fmaxf 同樣有此問題,但宏更隱蔽std::max/std::min、C11 fmax/fmin(<math.h>)、或簡單三元運算 a = (b > a) ? b : a| 寫法 | 標準 | 類型安全 | 側效應安全 | 可移植 |
|---|---|---|---|---|
a >?= b | GCC 擴展 | 否 | 否 | 否 |
a = (b > a) ? b : a | C89+ | 是 | 是(單次求值) | 是 |
fmax(a, b) | C99 | double | 否(可能多次求值) | 是 |
std::max(a, b) | C++98 | 模板/強類型 | 是 | 是 |
了解此擴展有助於閱讀舊代碼或 GCC 專用項目,但新代碼嚴禁使用。請使用標準三元運算、fmax/fmin 或 C++ std::max/min,保證可移植、類型安全、無副作用驚喜。