我不能用&&创建if语句。和||

时间:2015-05-15 21:24:42

标签: objective-c if-statement

我试图像这样制作一个if语句:

if ([myString isEqualToString:@"string"] && myint == 3 || myint == 2) {...}

这基本上是什么,它确保strings是平等的。然后,myint可以等于2或3。

当我尝试这样做时,我收到错误'&&' withing '||'。它建议在&&语句中加上括号,如下所示:

if (([myString isEqualToString:@"string"] && myint == 3) || myint == 2)

我的问题是,为什么我不能在没有括号的情况下这样做。括号做了什么?

2 个答案:

答案 0 :(得分:5)

实际上,你想要的是

if ([myString isEqualToString:@"string"] && (myint == 3 || myint == 2))

括号做他们一直做的事情:他们确定操作的顺序,而不是将它留给操作员的优先级(你不太可能知道)。

答案 1 :(得分:3)

你收到了警告,在你的情况下,警告非常好,因为你的代码不会做你想做的事情。

根据C,C ++和Objective-C语言(以及其他语言)的规则,

if (a && b || c)

表示:如果a和b都为真,或者c为真,则执行某些操作。那不是你的意思;你想要的是:如果a是真的,那么做一些事情,b和c中的一个是真的。要做到这一点,你写

if (a && (b || c))

括号将事物组合在一起。 &安培;&安培;比||强这意味着如果你没有括号,比如&& b || c,然后&&将a和b组合在一起。结果与(a&& b)||相同c,但不是&& (b || c)。

Objective-C经常会对技术合法的代码发出警告,但可能不符合您的意图。这是一个案例,实际上,代码没有按照你的意图行事。编译器告诉你的是:如果你写if(a&& b || c)那么它与if((a&& b)|| c)相同,但在后一种情况下是编译器确定你知道你在做什么。