2015-03-18 29 views
12

Znalazłem następujący kod w źródle jądra Linux (2.6.32).Co to jest "return x? : 1 "oznacza w języku 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? 
} 

Aby zrozumieć zachowanie, mam ręcznie próbowałem następujący kod

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

I got następujący wynik

f 1 
f 1 

I kiedy go zmienić na

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

Otrzymuję

f 2 
f 1 

Chcę tylko wiedzieć, czy to zachowanie (powrót 1, jeśli nic nie wspomniano) jest wymienione w standardzie.

Odpowiedz

15

To zachowanie nie jest wymienione w standardzie C. Jest to GCC extension.

Środkowy operand wyrażenia warunkowego można pominąć. Następnie, jeśli pierwszy operand jest niezerowy, jego wartością jest wartość wyrażenia warunkowego.

związku z tym, wyrażenie

x ? : y 

ma wartość x jeśli jest różna od zera; w przeciwnym razie wartość y.

Ten przykład jest całkowicie równoważna

x ? x : y 

W tym prostym przypadku, możliwość pominięcia środkowy operand nie jest szczególnie przydatna. Kiedy staje się użyteczny, to kiedy pierwszy operand ma, lub może (jeśli jest to argument makro), zawiera efekt uboczny. Następnie powtórzenie operandu w środku spowoduje dwukrotny efekt uboczny. Pominięcie środkowego argumentu używa wartości już wyliczonej bez niepożądanych efektów jej przeliczenia.

+4

@Dvvov; Komentarz byłby doceniony? – haccks

13

To jest GCC extension. x?:2 jest taki sam jak x?x:2 (z częścią , a następnie ocenioną raz)

3

Zgodnie GCC extension

środkowa operandów w wyrażeniu warunkowym może zostać pominięty

return x?:1; jest sposób krótki używana do pisania return x?x :1;

5

To C GNU przedłużenie normalnego operatora trójskładnikowego. X ?: Y jest taki sam jak X ? X : Y, z tym że X jest oceniany tylko raz.