14

在 gcc 中,我可以写foo ? : barwhich 是的简写形式,foo ? foo : bar但我看到 K&R 没有提到它。

这是我应该依赖的东西,在某些标准中定义吗?或者只是我应该避免的(邪恶的)gcc 扩展?

4

3 回答 3

14

这是一个GCC 扩展,名称为:
Conditionals with Omitted Operands

不是标准的 c.Using-pedantic编译标志会告诉你。

条件表达式中的中间操作数可以省略。那么如果第一个操作数非零,它的值就是条件表达式的值。

因此,表达式

    x ? : y

如果 x 不为零,则具有 x 的值;否则,y 的值。

这个例子完全等同于

    x ? x : y

在这种简单的情况下,省略中间操作数的能力并不是特别有用。当它变得有用时,第一个操作数确实或可能(如果它是宏参数)包含副作用。然后在中间重复操作数将执行两次副作用。省略中间操作数会使用已经计算的值,而不会产生重新计算的不良影响。

这是我应该依赖的东西,在某些标准中定义吗?或者只是我应该避免的(邪恶的)gcc 扩展?

取决于您的要求,如果您的代码不需要在 GCC 以外的任何其他编译器实现上运行,那么您可以使用它。但是,如果您的代码要跨不同的其他编译器实现构建,那么您不应该使用它。

无论如何,考虑到我总是建议避免这种(丑陋的)结构,一个人的目标应该是尽可能多地编写直观和可读的代码。

于 2012-06-08T09:29:10.420 回答
4

这是一个 GCC 扩展。它不是 C 标准的一部分,但 GCC 编译器允许您使用它。有关详细信息,请参阅其文档,并注意其与“等效”三元表达式的行为差异。

于 2012-06-08T09:27:58.330 回答
1

这是 GCC 中包含的扩展。

如果使用另一个编译器(不支持该扩展)进行编译,它将不起作用

所以我建议避免使用这种类型的快捷方式。

编辑:正如@KevinCox 指出的那样,即使 aDEFINE也行不通(见下面的第二条评论)。

于 2012-06-08T09:27:17.537 回答