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