- 某日看linux源碼時,無意中發現
return copied ? : err;
- 這是什么鬼?乍一眼看去貌似不合符語法規則
-
于是翻看了C99規范
C99 - 貌似也沒有省略的說明
-
C89中也沒有這個相關的描述
C89 -
在MSVC中這個語法是編譯不了的
msvc -
GCC倒是可以
GCC - 這等價于
d = a ? a : 1;
省略了2行代碼(一個MOV,一個JMP)
- 這是GCC的一個trick?
- 后來在這個地址http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals找到了官方的說明,證實了猜測。根據這個的說明,省略掉掉中間的參數是為了避免條件運算符計算時所引起的副作用。
- https://stackoverflow.com/questions/10143125/c-conditional-operator-with-empty-second-parameter 這個地址也有相關的討論