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?:ca?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 上。【参考方案3】:

除非我错了,否则您使用的是编译器扩展(猜测是 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条件运算符('?'),第二个参数为空[重复]的主要内容,如果未能解决你的问题,请参考以下文章

jQuery忽略第二个条件[重复]

Java逻辑运算符

在Java中if条件里的与运算符

带有 void 操作数的 C++ 条件运算符

第二十二节,三元运算

PHP数据访问修改和多条件查询(20161030)