在3.0.4 Linux内核中,mm / filemap.c有这行代码:
retval = retval ?: desc.error;
我尝试用gcc -Wall编译一个类似的最小测试用例并且没有得到任何警告;行为似乎与:
相同retval = retval ? retval : desc.error;
看看C99标准,我无法弄清楚正式描述这种行为的原因。为什么这样?
答案 0 :(得分:36)
正如其他几位人士所说,这是GCC扩展,不属于任何标准。如果您使用-pedantic
开关,则会收到警告。
此扩展程序的点在这种情况下并不真正可见,但想象一下是否
retval = foo() ?: desc.error;
使用扩展名,foo()
只会被调用一次。没有它,你必须引入一个临时变量,以避免两次调用foo()
。
答案 1 :(得分:19)
这是一个gcc扩展。 x ?: y
相当于x ? x : y
---请参阅http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals。
是的,我认为这也是邪恶的。
答案 2 :(得分:7)
这是一个名为Conditionals with Omitted Operands的GCC扩展程序。省略中间操作数具有使用条件的值作为省略的操作数而不再对其进行评估的效果。即使条件是宏,也可以安全使用。
答案 3 :(得分:3)
这是C的特定于gcc的扩展,并不是标准的。