以三元幸福的名义(以及对啰嗦的蔑视)...我希望,并且有点惊讶......
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
被开发?)
答案 0 :(得分:3)
C(以及扩展,C ++和Objective-C 1 )运算符形成expressions;它们旨在评估价值,而不是控制程序流程。
因此,虽然?:
,&&
和||
都提供了short-circuit evaluation个参数,但您无法使用它们来有条件地调用任意函数; 2 < / sup>你应该使用传统的控制流构造(即if
)。
你可以使用鲜为人知的comma operator来实现这一点,但我强烈建议你不要,因为它非常单一,而且很难阅读。 e.g:
isItOpen = condition ? (func1(), NO) : (func2(), YES);
<小时/> <子>
void
的函数,或者在bool
和&&
的情况下不能隐式转换为||
的类型,或者?:
。答案 1 :(得分:3)
只要在close
上执行的open
和it
方法返回布尔值,您的代码就可以正常工作。否则,没有雪茄。
答案 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];
这将使大多数人做双重拍摄; - )