使用三元运算符+&&进行分配和操作。在Objective-C?

时间:2012-03-21 18:56:42

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

以三元幸福的名义(以及对啰嗦的蔑视)...我希望,并且有点惊讶......

BOOL isItOpen = YES;
isItOpen = (isItOpen ? YES : NO); // yes, dumbie, it's open.

工作得很好......但那......

isItOpen = (isItOpen ? [it close] && NO : [it open] && YES);

结果为Invalid operands to binary expression ('void' and 'int')

我似乎无法追踪一个简单的是或否关于是否可以使用&&(或||)有条件地链接操作,就像BASH或PHP那样。我尝试了&&&安排的各种组合,但无济于事......因为我是C白痴...但是如果这种“做到这一点的方式”是不可能的,那么在语言上......还有另一个 - 那简洁明了吗? (即,没有if被开发?)

4 个答案:

答案 0 :(得分:3)

C(以及扩展,C ++和Objective-C 1 )运算符形成expressions;它们旨在评估价值,而不是控制程序流程。

因此,虽然?:&&||都提供了short-circuit evaluation个参数,但您无法使用它们来有条件地调用任意函数; 2 < / sup>你应该使用传统的控制流构造(即if)。

可以使用鲜为人知的comma operator来实现这一点,但我强烈建议你不要,因为它非常单一,而且很难阅读。 e.g:

isItOpen = condition ? (func1(), NO) : (func2(), YES);

<小时/> <子>

  1. 实际上,我不知道Objective-C。众所周知,这可能是有可能的!
  2. 并且通过“任意”,我指的是返回void的函数,或者在bool&&的情况下不能隐式转换为||的类型,或者?:
  3. 的情况下为非匹配类型

答案 1 :(得分:3)

只要在close上执行的openit方法返回布尔值,您的代码就可以正常工作。否则,没有雪茄。

答案 2 :(得分:3)

如果你想使用三元运算符,你可以这样做:

isItOpen ? ([it close], isItOpen = NO) : ([it open], isItOpen = YES);

或者:

isItOpen ? [it close] : [it open];
isItOpen = !isItOpen;

但这不是一个好的编程风格,你应该避免它。

以下代码更易读(至少是C / C ++ / Objective-C程序员):

if (isItOpen)
    [it close];
else
    [it open];
isItOpen = !isItOpen;

按照优先顺序,我建议您使用代码的第三个版本,然后是第二个版本,然后是第一个版本。

答案 3 :(得分:3)

您遇到的差异是由于Objective-C有:

(a)没有返回值的真正程序(void函数/方法);和 (b)比PHP更强大的类型系统

在您的示例中,主要问题是(a) - 您正在调用返回 nothing 的方法,而 nothing 不是布尔值。

在PHP函数中总是返回某事,定义为返回void的函数实际上被定义为返回“无用”值。然而,PHP会将任何东西转换为任何东西(并且这样做不一致,为了增加“乐趣”),所以“无用”值具有布尔值 - 尽管这可能取决于月亮的相位;-)此功能确实意味着你可以在之后可靠地链接一个“void”函数,它返回一个值 - <expr convertible to boolean> && <"void" function>将在PHP中起作用(但结果的布尔值是任意的)。同样的事情在Objective-C中不起作用(尝试用逗号运算符修复它,该运算符有隐藏的陷阱)。

因此,如果您坚持使用返回布尔值的函数/方法,或者隐式或显式转换为布尔值的类型(例如,对于指针类型nil为false,其他值为true;对于整数类型,0为false,其他一切都是真的)你可以“有条件地链接”操作。无论你应该这样做都是一个不同的问题......

P.S。如果你想混淆,这很简短:

(isItOpen = !isItOpen) ? [it open] : [it close];

这将使大多数人做双重拍摄; - )