在C中,何时支持条件"test?:alt"形式(空真实案例)?

blu*_*ift 14 c conditional gcc

在gcc中,我可以写foo ? : bar一下这是一种速记形式,foo ? foo : bar但我看到K&R没有提到它.

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

Alo*_*ave 14

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

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

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

因此,表达

    x ? : y

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

这个例子完全等同于

    x ? x : y

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

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

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

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

  • 谢谢.我想我会停止使用它. (2认同)