在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的扩展,不是标准的