【问题标题】:What is the ?: operator什么是 ?: 运算符
【发布时间】:2013-07-31 18:16:18
【问题描述】:

在一个 Objective-C 代码示例中,我找到了这个操作符

self.itemViews[@(0)] ?: [self.dataSource slidingViewStack:self viewForItemAtIndex:0 reusingView:[self dequeueItemView]];

代码在 Apple LLVM 4.2 下编译。

我遇到的唯一一件事是作为矢量运算符,但我不认为 Objective-C 和 C 具有矢量运算符。所以有人可以提供这个运营商的参考和/或文档。

【问题讨论】:

    标签: objective-c c operators


    【解决方案1】:

    它是ternary operator,因为Objective-C是C的超集,你可以使用这个操作符。

    一些tutorial 对此。

    a = x ? :是的;

    表达式等价于

    a = x ? x : y;

    【讨论】:

      【解决方案2】:

      您熟悉Ternary operator 吗? 常见的样式:

      test ? result_a : result_b;
      

      这里发生的只是第一个分支没有给出,所以在肯定的情况下什么都不会发生。类似于以下内容:

      test ?: result_b;
      

      由于 C 的评估方式,如果测试不真实,则返回 result_b,否则返回 test

      在您给出的示例中 - 如果视图丢失,它会回退到检查数据源以提供替换值。

      【讨论】:

        【解决方案3】:

        ?: 是 C 条件运算符

        a ? b : c
        

        如果a 不同于0c 如果a 等于0 则产生b 值。

        GNU 扩展 (Conditional with Omitted Operand) 允许在没有第二个操作数的情况下使用它:

         x ? : y 
        

        等价于

         x ? x : y
        

        【讨论】:

        • 这是正确的,但实际上并没有解释发生了什么。在这种情况下,如果self.itemViews[@(0)] 为 nil,则使用数据源设置值。
        • 但这是唯一提到 ?: 是 GNU 扩展这一事实的答案
        • 哈哈,忽略了。
        【解决方案4】:

        这是?算子,叫三元算子,就是这样使用的:

        condition ? true-branch : false-branch; 
        

        当条件评估为真(非零)时,执行: 之前的分支,否则执行另一个分支。这甚至可能返回一个值:

        value = condition ? true-branch : false-branch; 
        

        在您的情况下,返回值被省略并且 true-branch 为空(无事可做)。然后返回 condition 的返回值,但在您的示例中未使用。

        等价于

        if (!self.itemViews[@(0)]) 
          [self.dataSource slidingViewStack:self viewForItemAtIndex:0 reusingView:[self dequeueItemView]];
        

        恕我直言,这是更好的编程风格。

        【讨论】:

          【解决方案5】:

          以上称为三元运算符或条件运算符。

          语法是,

               <condition>?<true_part>:<false_part>
          

          这里如果条件为真,将被视为值,否则将被视为值。

          请参考这个,http://en.wikipedia.org/wiki/%3F:

          【讨论】:

          • 链接到问号字符有什么好处?
          • 它是一行代码,带有 if then else 功能。节省大量编码
          • 我没有在代码前添加 8 个空格。所以它最终出现了?:尽管上面显示了代码。抱歉没有检查
          【解决方案6】:

          此运算符用于Objective C,此运算符用于条件运算符。是运行一个语句还是另一个语句取决于使用的逻辑术语和您提供的输入.

          【讨论】:

            猜你喜欢
            • 2012-05-11
            • 1970-01-01
            • 1970-01-01
            • 2015-05-28
            • 2010-09-21
            • 1970-01-01
            相关资源
            最近更新 更多