Linux中条件运算符的奇怪用法



在3.0.4 Linux内核中,mm/filemap.c有这样一行代码:

retval = retval ?: desc.error;

我试着用gcc -Wall编译一个类似的最小测试用例,没有得到任何警告;该行为似乎与:

相同
retval = retval ? retval : desc.error;

看C99标准,我不知道什么正式描述了这种行为。为什么这样可以?

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

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

retval = foo() ?: desc.error;

带扩展名的foo()只被调用一次。如果没有它,您必须引入一个临时变量,以避免两次调用foo()

这是一个gcc扩展。x ?: y相当于x ? x : y——参见http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals。

是的,我也认为它很邪恶。

这是一个名为省略操作数条件的GCC扩展。省略中间操作数的效果是使用条件的值作为省略的操作数,而不再次对其求值。

这是C语言的特定于gcc的扩展,不是标准的

最新更新