在 C 中,何时支持有条件的“测试?:替代”形式(空真大小写)? [复制]

Posted

技术标签:

【中文标题】在 C 中,何时支持有条件的“测试?:替代”形式(空真大小写)? [复制]【英文标题】:In C, when is conditional "test ? : alt" form (empty true case) supported? [duplicate] 【发布时间】:2012-06-12 08:33:22 【问题描述】:

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

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

【问题讨论】:

这是一个邪恶的 gcc 扩展,你应该避免。 我不知道为什么每个人都讨厌这个扩展。它非常简洁,通常更能代表我的意思。我希望它将它添加到标准中。但是,如果您希望与 gcc 和 clang 以外的编译器兼容,则不应使用它。 【参考方案1】:

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

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

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

因此,表达式

    x ? : y

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

这个例子完全等价于

    x ? x : y

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

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

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

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

【讨论】:

谢谢。我想我会停止使用它。【参考方案2】:

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

【讨论】:

【参考方案3】:

这是 GCC 中包含的扩展。

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

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

编辑:正如@KevinCox 指出的那样,即使DEFINE 也不起作用(请参阅下面的第二条评论)。

【讨论】:

不起作用,我从未听说过任何其他编译器实现了这种(无用的)功能。 此功能无法通过宏正确实现。 #define OR(a,b) ((a)?(a):(b)) 不正确,因为它可能会评估 a 两次。这也不能通过(内联)函数实现,因为它必须是通用的。

以上是关于在 C 中,何时支持有条件的“测试?:替代”形式(空真大小写)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#...何时需要重写ToString()方法?

索引失效的情况有哪些?索引何时会失效?(全面总结)

size_t——为什么支持size_t,何时使用size_t?

C语言的分支语句有哪几种?C语言分支结构的基本形式是啥,区别是啥?

为啥以及何时在 WHERE 子句中带有条件的 LEFT JOIN 不等于在 ON 中的相同 LEFT JOIN? [复制]

golang项目中使用条件编译