2015-03-18 2 views
12

Я столкнулся с следующим кодом в источнике ядра Linux (2.6.32).Что означает `return x? : 1 означает на языке 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? 
} 

Чтобы понять поведение, я вручную попытался следующий код

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

И получил следующий вывод

f 1 
f 1 

И когда я изменить его на

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

Я получаю

f 2 
f 1 

Я просто хочу знать, упомянуто ли это поведение (возврат 1, если ничего не упомянуто) в стандарте.

ответ

15

Такое поведение не упоминается в стандарте C. Его a GCC extension.

Средний операнд в условном выражении может быть опущен. Тогда, если первый операнд отличен от нуля, его значение является значением условного выражения.

Поэтому выражение

x ? : y 

имеет значение x, если это не равен нулю; в противном случае - значение y.

Этот пример совершенно эквивалентно

x ? x : y 

В этом простом случае, возможность опускать средний операнд не особенно полезно. Когда это становится полезным, это когда первый операнд делает или может (если он является аргументом макроса), содержит побочный эффект. Затем повторение операнда в середине будет выполнять побочный эффект дважды. Опускание среднего операнда использует значение, уже вычисленное без нежелательных эффектов пересчета.

+4

@Downvoter; Комментарий будет оценен? – haccks

13

Это GCC extension. x?:2 такая же, как x?x:2затем части вычисляется один раз)

3

В соответствии с GCC extension

Средний операнд в условном выражении может быть опущен

return x?:1; представляет собой метод короткого рука, чтобы написать return x?x :1;

5

Это GNU C расширение нормального тройного оператора. X ?: Y - это то же, что и X ? X : Y, за исключением того, что X оценивается только один раз.

Смежные вопросы