Questo è un GCC estensione dal nome:
Conditionals with Omitted Operands.
È non standard c.Utilizzando -pedantic
la bandiera per la compilazione ti dirà così.
L'operando centrale in un'espressione condizionale può essere omesso. Quindi se il primo operando è diverso da zero, il suo valore è il valore dell'espressione condizionale.
Pertanto, l'espressione
x ? : y
ha il valore di x è diverso da zero se; altrimenti, il valore di y.
Questo esempio è perfettamente equivalente a
x ? x : y
In questo semplice caso, la possibilità di omettere l'operando centrale non è particolarmente utile. Quando diventa utile è quando il primo operando fa, o può (se è un argomento macro), contenere un effetto collaterale. Quindi ripetere l'operando nel mezzo eseguirà l'effetto collaterale due volte. L'omissione dell'operando medio utilizza il valore già calcolato senza gli effetti indesiderati del ricalcalo.
E 'questo qualcosa che dovrei fare affidamento su, definito in qualche standard? O solo un'estensione (cattiva) di gcc che dovrei evitare?
dipende dai requisiti, Se il codice does'nt bisogno per funzionare su qualsiasi altra implementazione compilatore GCC diversa quindi è possibile utilizzarlo.Tuttavia, se il tuo codice si basa su diverse altre implementazioni del compilatore, non dovresti usarlo.
In ogni caso, si dovrebbe mirare a scrivere il più intuitivo e codice leggibile possibile dato che vorrei suggerire sempre evitare tale (brutto) costruisce.
fonte
2012-06-08 09:29:10
È un'estensione gcc malvagia che dovresti evitare. – Lundin
Non so perché tutti odiano questa estensione. È molto conciso e spesso rappresenta meglio ciò che intendo. Vorrei che fosse aggiunto allo standard. Tuttavia, poiché non lo è, non dovresti usarlo se desideri compatibilità con i compilatori diversi da gcc e clang. –