首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux中条件运算符的奇怪用法

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

Stack Overflow用户
提问于 2011-10-19 06:46:46
回答 4查看 2K关注 0票数 37

在3.0.4 Linux内核中,mm/filemap.c包含以下代码行:

代码语言:javascript
复制
retval = retval ?: desc.error;

我曾尝试用gcc -Wall编译一个类似的最小测试用例,没有得到任何警告;其行为似乎与以下行为相同:

代码语言:javascript
复制
retval = retval ? retval : desc.error;

看看C99标准,我想不出是什么正式地描述了这种行为。为什么这是可以的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-19 06:56:32

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

在这种情况下,这个扩展的意义并不明显,但是想象一下,如果它是

代码语言:javascript
复制
retval = foo() ?: desc.error;

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

票数 36
EN

Stack Overflow用户

发布于 2011-10-19 06:49:14

这是gcc的分机。x ?: y等同于x ? x : y -参见http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals

是的,我也认为这是邪恶的。

票数 20
EN

Stack Overflow用户

发布于 2011-10-19 06:49:09

这是一个叫做Conditionals with Omitted Operands的GCC扩展。省略中间操作数的效果是将条件的值用作省略的操作数,而无需再次计算它。即使条件是宏,使用它也是安全的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7814694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档