【问题标题】:C conditional operator ('?') with empty second parameter [duplicate]C条件运算符('?'),第二个参数为空[重复]
【发布时间】:2012-04-25 22:52:25
【问题描述】:

通常是“?”运算符的使用形式如下:

A ? B : C

但是在 B = A 的情况下,我看到了以下缩写

A ? : C

这出人意料地有效。将第二个参数保留在(风格方面)更好,还是某些编译器无法处理这个问题?

【问题讨论】:

  • 看起来像Groovy-like 语法。

标签: c operators conditional ternary-operator


【解决方案1】:

C 语言不允许这样做(据我所知),但诸如 gcc 之类的编译器将快捷方式 a?:c 用作extensiona?: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 排除在语句之外,其他人可能难以阅读您的代码并对其进行改进。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-09
          • 1970-01-01
          相关资源
          最近更新 更多