2012-06-08 7 views
14

In gcc, posso scrivere foo ? : bar che è una forma abbreviata di foo ? foo : bar ma vedo che K & R non lo menziona.In C, quando è supportato il modulo "test?: Alt" (vuoto vero caso)?

È qualcosa su cui dovrei fare affidamento, definito in alcuni standard? O solo un'estensione (cattiva) di gcc che dovrei evitare?

+2

È un'estensione gcc malvagia che dovresti evitare. – Lundin

+0

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. –

risposta

14

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.

+2

Grazie. Penso che smetterò di usarlo. – blueshift

1

Questa è un'estensione inclusa in GCC.

E 'non lavoro se la compilazione con un altro compilatore (che non supporta tale estensione).

Quindi vorrei raccomandare di evitare l'uso di questo tipo di scorciatoia.

MODIFICA: Come sottolineato da @KevinCox, anche un DEFINE non funzionava (vedere 2 ° commento in basso).

+0

It_will_ non funziona, non ho mai sentito nessun altro compilatore che implementa tale funzione (inutile). – Lundin

+0

Questa funzione ** non può ** essere correttamente implementata tramite una macro. '#define OR (a, b) ((a)? (a) :(b))' non è corretto perché può valutare 'a' due volte. Anche questo non può essere implementato tramite una funzione (in linea) perché dovrebbe essere generico. –

4

Questa è un'estensione GCC. Non fa parte dello standard C, ma il compilatore GCC ti consente di usarlo. Vedi il suo documentation per i dettagli, e sii consapevole delle sue differenze comportamentali con l'espressione ternaria "equivalente".