在C中,什么时候有条件的“测试? :支持alt“form(空真实案例)? [重复]

问题描述 投票:14回答:3

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

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

c gcc conditional
3个回答
14
投票

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

它不是标准的c。使用-pedantic标志进行编译会告诉你。

可以省略条件表达式中的中间操作数。然后,如果第一个操作数非零,则其值为条件表达式的值。

因此,表达

    x ? : y

如果非零,则其值为x;否则,y的值。

这个例子完全等同于

    x ? x : y

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

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

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

无论如何,我应该尽可能地编写尽可能多的直观和可读的代码,因为我总是建议避免使用这种(丑陋的)构造。


4
投票

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


1
投票

这是GCC中包含的扩展。

如果使用其他编译器(不支持该扩展)进行编译,则无法正常工作。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.