2015-03-18 12 views
12

Ho trovato il seguente codice nel sorgente del kernel Linux (2.6.32).Cosa restituisce x? : 1` significa in linguaggio C?

do_wait_for_common(struct completion *x, long timeout, int state) 
{ 
     if (!x->done) { 
     /* some code here */ 
     } 
     x->done--; 
     return timeout ?: 1; <--- What it returns? 
} 

per capire il comportamento, ho provato manualmente il seguente codice

#include <stdio.h> 
int f(int x) 
{ 
     return x?:1; 
} 
int main() 
{ 
     printf("f %d\n", f(0)); 
     printf("f %d\n", f(1)); 
     return 0; 
} 

e ha ottenuto il seguente output

f 1 
f 1 

E quando ho cambiare a

int f(int x) 
{ 
     return x?:2; 
} 

Sto ricevendo

f 2 
f 1 

Voglio solo sapere se questo comportamento (ritorno 1 se non menzionato) è menzionato nello standard.

risposta

15

Questo comportamento non è menzionata in C standard. È un GCC extension.

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 se è diverso da zero; in caso contrario, il valore di .

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.

+4

@Downvoter; Un commento sarebbe apprezzato? – haccks

13

È un GCC extension. x?:2 è lo stesso x?x:2 (con la parte poi valutata volta)

3

Secondo GCC extension

L'operando medio in un'espressione condizionale può essere omessa

return x?:1; è un metodo breve mano per scrivere return x?x :1;

5

Questo è un GNU C estensione del normale operatore ternario. X ?: Y corrisponde a X ? X : Y tranne per il fatto che lo X viene valutato solo una volta.