【问题标题】:curious what is wrong with this if statement?好奇这个 if 语句有什么问题?
【发布时间】:2011-05-23 21:39:28
【问题描述】:

有人能解释一下这个“if 语句”有什么问题吗?我明白了:

“需要左值作为赋值的左操作数”。

这不起作用:

if ([[prepDataArray objectAtIndex:iNDEX] boolValue] = YES) {
        NSLog(@"HARD");
    }

虽然这有效:

diffQ = [[prepDataArray objectAtIndex:iNDEX] boolValue];
    if (diffQ = YES) {
        NSLog(@"HARD");
    }

我确实意识到问题出在哪里,并且“左值”表明我需要在左侧有一些不同的东西,但我不明白为什么以及如何在尝试的“if”语句中做我想做的事情第一个例子。

如果有好心人能给我一个提示,将不胜感激:-)

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    我完全同意@thomas 上面所说的,但让我补充一下。

    不要将布尔值与 YES 进行比较。并不是if 构造需要

    if( some comparison statement ) {
          ....
    }
    

    事实并非如此。 if 构造具有以下形式:

    if( a boolean value) {
          ...
    }
    

    比较语句会产生一个布尔值,所以你把它放在if 语句中。 在你的情况下,boolValue 已经给你一个bool。您无需将其与 YESNO 进行比较。这就像 YES==YESYES==NO 一样,完全是多余的。

    做吧

    if ([[prepDataArray objectAtIndex:iNDEX] boolValue]) {
        NSLog(@"HARD");
    }
    

    【讨论】:

    • +1。虽然这是完全正确的,但我发现自己在使用 Objective C 编程时添加了 == YES。即使它没用(编译器可能会删除它)ObjC 是一种冗长的语言,消息调用几乎读起来像英文句子,所以有点“更多”有时很好。不过,在 C 语言中我从不这样做。
    • 那你为什么不写(((x==YES)==YES)==YES)==YES?我在开玩笑;)
    • 我同意这两点 - 但有时肯定需要冗长。为了两全其美(并避免海报所犯的错误),我总是尝试在比较中交换参数,即。 if(variable == YES) 变成 if(YES == variable)
    【解决方案2】:
    if ([[prepDataArray objectAtIndex:iNDEX] boolValue] == YES) {
        NSLog(@"HARD");
    }
    

    == 不是=

    第一个不起作用,因为您尝试将 BOOL (YES) 分配给消息。第二个有效,因为您尝试将BOOL 分配给diffQ。这是正确的,但不是您期望的结果(比较 diffQYES

    常见的编程错误;)我已经这样做了数百万次了

    【讨论】:

    • ohhhh 非常感谢你,我应该知道这一点,因为我前一段时间一直在努力解决这个问题。我觉得自己很愚蠢,尤其是因为我花了大约 45 分钟来测试这个。
    • 不要 ;) 你花在常见错误上的时间越长,你就越快成为一名优秀的程序员。这就像你大脑中的一个印记,强迫你避免你写的每一行的常见错误^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多