C条件运算符('?'),第二个参数为空[重复]
Posted
技术标签:
【中文标题】C条件运算符(\'?\'),第二个参数为空[重复]【英文标题】:C conditional operator ('?') with empty second parameter [duplicate]C条件运算符('?'),第二个参数为空[重复] 【发布时间】:2012-04-25 22:52:25 【问题描述】:通常是“?”运算符的使用形式如下:
A ? B : C
但是在 B = A 的情况下,我看到了以下缩写
A ? : C
这出人意料地有效。将第二个参数保留在(风格方面)更好,还是某些编译器无法处理这个问题?
【问题讨论】:
看起来像Groovy-like 语法。 【参考方案1】:C 语言不允许这样做(据我所知),但诸如 gcc 之类的编译器将快捷方式 a?:c 用作extension。
a?:c
与a?a:c
含义相同。
【讨论】:
意思是一样的……但需要注意的是a
不包含副作用。 a?:c
只执行一次a
,而a?a:c
会执行两次a
的副作用。
它也适用于 Clang。【参考方案2】:
它是gcc的扩展
Conditionals with Omitted Operands
x ? : y
等价于x ? x : y
【讨论】:
您链接到的页面自相矛盾。一方面它说“这个例子完全等同于x ? x : y
”,这意味着x
被评估了两次,但另一方面,最后一段指出x
只会被评估一次,这将使它完全等同于x || y
,而不是x ? x : y
@Celada :我认为这意味着x ? : y
大致等同于x ? x : y
,除了x
在前一种情况下只被评估一次。跨度>
@Celada : x || y
计算结果为 0 或 1,但此运算符并非如此。
我的立场是正确的。我认为||
如果第一个参数被认为是真实的(非零),则返回其第一个参数的值。
它是 ISO C99 功能之一。它适用于我在 Windows 平台上的 GCC
4.4.1TCC
(这是一个 ANSI C 编译器)版本 0.9.25 上。除非我错了,否则您使用的是编译器扩展(猜测是 gcc)。我很确定标准确实 not 允许您省略三元运算符的第二个操作数。
【讨论】:
【参考方案4】:我填了一点。
标准使用术语条件运算符。
语法 条件表达式: 逻辑或表达式 逻辑或表达式 ? 表达式:条件表达式
条件表达式不会产生左值。 还有; Wikipedia; Conditional
注意:即:C++ 有: 逻辑或表达式?表达式:赋值-表达式
约束: * 第一个操作数应为标量类型[1]。 * 对于第二个和第三个操作数应满足以下条件之一: — 两个操作数都有算术类型[2]; — 两个操作数具有相同的结构[3] 或联合类型[4]; — 两个操作数都有 void 类型[5]; — 两个操作数都是指向兼容的合格或不合格[6] 版本的指针 类型[7]; — 一个操作数是一个指针,另一个是一个空指针常量[8];要么 — 一个操作数是指向对象或不完整类型的指针[9],另一个是 是指向 void 的限定或非限定版本的指针。
足食:
[1] 标量类型:算术类型和指针类型。 [2] 算术类型:整数和浮点类型。 [3] 结构类型:顺序分配的非空成员对象集(并且,在 某些情况下,一个不完整的数组),每个都有一个 可选地指定名称和可能的不同类型。 [4] 联合类型:一组重叠的非空成员对象,每个对象都有 可选指定的名称和可能的不同类型。 [5] 空类型:一组空值;它是一个不完整的类型,不能 完全的。 [6] 限定类型:1998(const 和 volatile),1999(restrict),分别 2011(_原子)。 *[7] 兼容类型:它们的类型相同。 [8] 空指针。常量:NULL;实现定义的空指针常量。 [9] 不完整类型:描述对象但缺少确定所需信息的类型 他们的大小。
*Type qualifiers in C
所以:使用不明智。
【讨论】:
【参考方案5】:我在网上做了一点研究,根据***,这种行为得到了 C 的 GNU 扩展的支持。http://en.wikipedia.org/wiki/%3F:#C
所以很可能其他编译器认为这是非法的。顺便说一句,这个运算符被称为三元条件,因此您可以浏览它。
编辑:
我检查了 gcc 和 apple llvm,它工作正常。
【讨论】:
【参考方案6】:最好保留第二个参数。如果 B 发生变化,您可能不记得修改上面的语句。此外,如果您将 B 排除在语句之外,其他人可能难以阅读您的代码并对其进行改进。
【讨论】:
以上是关于C条件运算符('?'),第二个参数为空[重复]的主要内容,如果未能解决你的问题,请参考以下文章