2015-03-18 4 views
12

Ich habe den folgenden Code in der Linux-Kernel-Quelle (2.6.32) gefunden.Was gibt `zurück x? : 1 'bedeuten in C Sprache?

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? 
} 

das Verhalten zu verstehen, habe ich versucht, manuell den folgenden Code

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

Und bekam die folgende Ausgabe

f 1 
f 1 

Und wenn ich es ändern zu

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

Ich bekomme

Ich möchte nur wissen, ob dieses Verhalten (1 zurückgeben, wenn nichts erwähnt) im Standard erwähnt wird.

Antwort

15

Dieses Verhalten nicht in C-Standard erwähnt wird. Es ist ein GCC extension.

Der mittlere Operanden in einem bedingten Ausdruck kann weggelassen werden. Wenn der erste Operand ungleich Null ist, ist sein Wert der Wert des bedingten Ausdrucks.

Daher der Ausdruck

x ? : y 

hat den Wert von x wenn das nicht Null ist; andernfalls der Wert y.

Dieses Beispiel vollkommen äquivalent zu

x ? x : y 

In diesem einfachen Fall die Möglichkeit, den mittleren Operanden wegzulassen ist nicht besonders nützlich. Wann es nützlich wird, ist, wenn der erste Operand dies tut, oder kann (wenn es ein Makro-Argument ist) einen Nebeneffekt enthalten. Dann würde das Wiederholen des Operanden in der Mitte den Nebeneffekt zweimal ausführen. Das Auslassen des mittleren Operanden verwendet den Wert, der bereits berechnet wurde, ohne die unerwünschten Auswirkungen der Neuberechnung.

+4

@Downvoter; Ein Kommentar würde geschätzt werden? – haccks

13

Es ist ein GCC extension. x?:2 ist die gleiche wie x?x:2 (mit dem dann Teil einmal ausgewertet)

3

Wie pro GCC extension

Der mittlere Operand in einem bedingten Ausdruck kann

return x?:1; eine Kurz Hand Methode zu schreiben return x?x :1;

5

Dies ist ein GNU C entfallen Erweiterung des normalen ternären Betreibers. X ?: Y ist das gleiche wie X ? X : Y, außer dass X nur einmal ausgewertet wird.

Verwandte Themen