在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()
两次。
关于c - Linux 中条件运算符的奇怪使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814694/