【问题标题】:Ternary Operator in C (including Objective-C & C++) - Do Nothing on Else ConditionC 中的三元运算符(包括 Objective-C 和 C++) - 在其他条件下什么也不做
【发布时间】:2014-09-08 10:26:29
【问题描述】:

只是想从你们那里得到一些澄清。我试图弄清楚如何在 Objective-C 中使用三元运算符的指令的 else 条件下什么都不做。我开始做类似以下的事情,这似乎工作得很好,但我只是希望背景中没有奇怪的巫术。

(condition) ? [object method] : nil; 
self.intNumber = (localIntNumber) ? localIntNumber : self.intNumber; // set intNumber to itself if localIntNumber doesn't exist
self.myObject = (newObject) ? newObject : self.myObject; // different from intNumber in that we're dealing with a Foundation object (can be nil) instead of a regular int

上面的任何犹太洁食要做吗?想法?

【问题讨论】:

  • self.intNumber = (localIntNumber) ? localIntNumber : self.intNumber; 是完全合适的,假设 self.intNumber 已经是一个有效值。
  • 你甚至可以做self.intNumber = localIntNumber ?: self.intNumber;
  • 感谢大家的意见!对于我刚刚用于处理 Foundation 对象的新场景呢?
  • @Cornelius self.intNumber = localIntNumber ?: self.intNumber; 是允许省略第二个操作数的 c 扩展,等效于 self.intNumber = localIntNumber ? localIntNumber : self.intNumber;
  • 在某些情况下,是的,但是您给出的示例都支持使用if 语句(没有else)。因此,对于需要“什么都不做条件”的事情来说,最好避免使用三元运算符。

标签: objective-c c ternary-operator conditional-operator


【解决方案1】:

这两个都是可以接受的,阅读方式相同,编译方式相同:

self.intNumber = (localIntNumber) ? localIntNumber : self.intNumber; self.myObject = (newObject) ? newObject : self.myObject;

这也是可以接受的,正如@Cornelius 所指出的:

self.intNumber = localIntNumber ?: self.intNumber;
self.myObject = newObject ?: self.myObject;

不过,这种使用三元运算符的方式并不常见。请记住,您正在为未来的自己(可能还有其他人)编写代码,因此应该避免任何不必要的神秘。

在编写代码时,代码可读性应该是您的首要考虑因素

感谢 @trojanfoe 提出这个问题。

如果您没有else 条件,我强烈推荐其中之一

if (localIntNumber) {
    self.intNumber = localIntNumber
}

if (newObject) {
    self.myObject = newObject;
}

当然,假设您之前已经将 self.intNumberself.myObject 设置为有效值,以避免需要 else 条件。

【讨论】:

  • +1 if 语句也有小的性能提升,因为在问题中给出的一些示例中,三元运算符的“else”侧正在重新分配值.但是,完全有可能编译器足够聪明,可以看到其中的无效性并对其进行优化。
  • 别让我的 cmets 骗了你。我一直很享受我们一直在进行的讨论。感谢你们花时间在这里概述您对此事的想法:)。
  • 这里没有愚蠢,只是一个无法解释的飞跃。对不起。
  • 我经常写if (localIntNumber) self.intNumber = localIntNumber; 没有大括号的一行来提醒自己这是一个纯值操作,而不是一个控制流。我发现这比单面三元要好,虽然不是很多。
猜你喜欢
  • 2021-10-17
  • 2010-10-20
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2013-07-13
相关资源
最近更新 更多