我试图像这样制作一个if语句:
if ([myString isEqualToString:@"string"] && myint == 3 || myint == 2) {...}
这基本上是什么,它确保strings
是平等的。然后,myint
可以等于2或3。
当我尝试这样做时,我收到错误'&&' withing '||'
。它建议在&&
语句中加上括号,如下所示:
if (([myString isEqualToString:@"string"] && myint == 3) || myint == 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)相同,但在后一种情况下是编译器确定你知道你在做什么。