什么'返回x? :1`表示C语言?

时间:2015-03-18 06:17:10

标签: c ternary-operator conditional-operator

我在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)。

4 个答案:

答案 0 :(得分:16)

C标准中未提及此行为。它是GCC extension

  

条件表达式中的中间操作数可以省略。然后,如果第一个操作数非零,则其值为条件表达式的值。

     

因此,表达式

 x ? : y
     如果非零,则

的值为x;否则,y

的值      

此示例完全等同于

 x ? x : y  
     

在这个简单的例子中,省略中间操作数的能力并不是特别有用。当它变得有用时是第一个操作数,或者可能(如果它是一个宏参数),包含副作用。然后在中间重复操作数将执行两次副作用。省略中间操作数使用已经计算的值而没有重新计算它的不良影响。

答案 1 :(得分:13)

这是GCC extensionx?:2x?x:2相同(然后部分评估一次)

答案 2 :(得分:5)

这是普通三元运算符的GNU C扩展。 X ?: YX ? X : Y相同,但X仅评估一次。

答案 3 :(得分:3)

根据GCC extension

  

条件表达式中的中间操作数可以省略

return x?:1;是编写return x?x :1;

的简便方法