首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GCC 擴展運算符 >?= 與 <?=:最大值/最小值賦值的「喪心病狂」寫法

     編輯:關於C語言

GCC 擴展運算符 >?= 與 <?=:最大值/最小值賦值的「喪心病狂」寫法

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;
}

編譯器支持情況

  • GCC:默認支持(C89/C99 模式),C11/C17 模式需 -std=gnu11 等 GNU 擴展模式
  • Clang:兼容 GCC 擴展,支持
  • MSVC:不支持
  • 標準 C/C++:不屬於任何標準,屬編譯器擴展

為什麼稱之為「喪心病狂」?

  1. 可移植性極差:換編譯器即報錯,跨平台項目禁用
  2. 可讀性極低:符號組合無直觀語義,初見者難以理解
  3. 側效應陷阱:a >?= func() 中 func() 可能被調用多次(宏展開語義),標準 fmax/fmaxf 同樣有此問題,但宏更隱蔽
  4. 現代替代方案更優:C++ std::max/std::min、C11 fmax/fmin(<math.h>)、或簡單三元運算 a = (b > a) ? b : a

標準化替代方案對比

寫法標準類型安全側效應安全可移植
a >?= bGCC 擴展否否否
a = (b > a) ? b : aC89+是是(單次求值)是
fmax(a, b)C99double否(可能多次求值)是
std::max(a, b)C++98模板/強類型是是

結論

了解此擴展有助於閱讀舊代碼或 GCC 專用項目,但新代碼嚴禁使用。請使用標準三元運算、fmax/fmin 或 C++ std::max/min,保證可移植、類型安全、無副作用驚喜。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved