在gcc中,我可以写foo ? : bar
,这是foo ? foo : bar
的简写形式,但我看到K&R没有提到它。
这是我应该依赖的东西,在某些标准中定义了吗?或者只是一个(邪恶的)gcc扩展我应该避免?
这是一个GCC扩展名: Conditionals with Omitted Operands。
它不是标准的c。使用-pedantic
标志进行编译会告诉你。
可以省略条件表达式中的中间操作数。然后,如果第一个操作数非零,则其值为条件表达式的值。
因此,表达
x ? : y
如果非零,则其值为x;否则,y的值。
这个例子完全等同于
x ? x : y
在这个简单的例子中,省略中间操作数的能力并不是特别有用。当它变得有用时是第一个操作数,或者可能(如果它是一个宏参数),包含副作用。然后在中间重复操作数将执行两次副作用。省略中间操作数使用已经计算的值而没有重新计算它的不良影响。
这是我应该依赖的东西,在某些标准中定义了吗?或者只是一个(邪恶的)gcc扩展我应该避免?
取决于您的要求,如果您的代码不需要在除GCC之外的任何其他编译器实现上运行,那么您可以使用它。但是,如果您的代码是基于不同的其他编译器实现构建的,那么您不应该使用它。
无论如何,我应该尽可能地编写尽可能多的直观和可读的代码,因为我总是建议避免使用这种(丑陋的)构造。
这是GCC扩展。它不是C标准的一部分,但GCC编译器允许您使用它。有关详细信息,请参阅其documentation,并注意其与“等效”三元表达式的行为差异。
这是GCC中包含的扩展。
如果使用其他编译器(不支持该扩展)进行编译,则无法正常工作。
所以我建议避免使用这种类型的快捷方式。
编辑:正如@KevinCox指出的那样,即使是DEFINE
也行不通(见下面第2条评论)。