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