Objective-C中if多条件不等判断语句失效问题咨询
问题分析与解决方案
嘿,你这是把逻辑运算符的用法搞反啦!咱们一步步理清楚:
为什么你的||写法不对?
你想要实现的是source既不等于"a",也不等于"b",但用||(逻辑或)的时候,只要其中一个条件为真,整个表达式就会判定为真。举几个实际场景的例子:
- 如果source是"a":
![source isEqualToString:@"a"]是假,但![source isEqualToString:@"b"]是真,整个||表达式结果为真,代码会执行——这完全违背你的初衷; - 如果source是"b":同理,另一个条件为真,表达式还是为真;
- 只有当source同时等于"a"和"b"的时候(这根本不可能),表达式才会为假——这完全和你要的逻辑背道而驰!
而你之前嵌套的两个if,本质上是**逻辑与(&&)**的关系:只有两个条件都满足(既不等于a,也不等于b),才会执行内部代码,所以单独测试每个条件都能正常工作。
正确的写法有两种:
写法一:用&&直接表达“既不…也不…”
把||换成&&就行,和你嵌套if的逻辑完全一致:
NSString *source = metaItem.stringValue; NSString *baddata = @"a"; NSString *baddata2 = @"b"; if (![source isEqualToString:baddata] && ![source isEqualToString:baddata2]) { if(![source isEqualToString:self.songInfo.text]) { self.songInfo.text = [source stringByAppendingString:@" "]; } }
写法二:用De Morgan定律简化(更贴合自然逻辑)
根据逻辑运算的De Morgan定律,“既不A也不B”等价于“不是(A或B)”,所以可以写成更直观的形式:
if (!([source isEqualToString:baddata] || [source isEqualToString:baddata2])) { if(![source isEqualToString:self.songInfo.text]) { self.songInfo.text = [source stringByAppendingString:@" "]; } }
这种写法读起来就是“如果source不是等于a或者等于b”,和你想要的自然语义完全匹配,更容易理解和维护。
总结
Objective-C里没有专门的nor关键字,你只需要用对逻辑运算符:
- 要表达“既不…也不…”:用
&&连接两个否定条件,或者用!包裹||连接的原条件; ||是“或”逻辑,只要有一个条件满足就为真,完全不适合你的场景。
内容的提问来源于stack exchange,提问作者omega1
相关产品推荐
相关产品推荐

