在Linux中奇怪的使用条件运算符

在3.0.4 Linux内核中,mm / filemap.c具有以下代码行:

retval = retval ?: desc.error; 

我已经试过用gcc -Wall编译一个类似的最小testing用例,不要收到任何警告; 行为似乎相同:

 retval = retval ? retval : desc.error; 

看看C99标准,我无法弄清楚这个行为的正式描述。 为什么这是好的?

正如其他几个人所说,这是一个GCC扩展,而不是任何标准的一部分。 如果使用-pedantic开关,你会得到一个警告。

在这种情况下,这个扩展并不是真正可见的,但是想象一下,如果它是这样的话

 retval = foo() ?: desc.error; 

有了扩展名, foo()只被调用一次。 没有它,你必须引入一个临时variables来避免两次调用foo()

这是一个海湾合作委员会扩展。 x ?: y相当于x ? x : y x ? x : y —请参阅http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals

是的,我认为这也是邪恶的。

这是一个GCC扩展名为Conditionals with Omitted Operands 。 省略中间操作数的作用是将条件的值作为省略的操作数使用,而不对其进行评估。 即使条件是macros,也是安全的。

这是C的gcc特定的扩展,不是标准的。