Подтвердить что ты не робот

Что означает `return x?: 1 означает на языке C?

Я нашел следующий код в источнике ядра Linux (2.6.32).

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, если ничего не упоминается) в стандарте.

4b9b3361

Ответ 1

Это поведение не упоминается в стандарте C. Его расширение GCC.

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

Следовательно, выражение

 x ? : y

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

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

 x ? x : y  

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

Ответ 2

Это расширение GCC. x?:2 совпадает с x?x:2 (с той частью, которая была оценена один раз)

Ответ 3

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

Ответ 4

По Расширение GCC

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

return x?:1; - это короткий метод для записи return x?x :1;