【问题标题】:Using the result of an assignment as a condition without parentheses使用赋值的结果作为不带括号的条件
【发布时间】:2010-12-06 18:02:01
【问题描述】:

我在自定义 UIActionSheet 类中有这个

if (otherButtonTitles != nil) {
    [self addButtonWithTitle:otherButtonTitles];
    va_list args;
    va_start(args, otherButtonTitles);
    NSString * title = nil;
    while(title = va_arg(args,NSString*)) { // error here
        [self addButtonWithTitle:title];
    }
    va_end(args);
}

我有这个错误

!使用赋值的结果作为不带括号的条件

指向这条线

while(title = va_arg(args,NSString*)) {

这是为什么呢?

谢谢。

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    这可能不是你说的错误,而是警告

    编译器警告您,当赋值处于条件中时,应将赋值括在括号内,以避免出现 assignment-when-you-mean-comparison 错误。

    要克服这个相当迂腐的编译器警告,您可以简单地将赋值括在另一对括号内:

    while((title = va_arg(args,NSString*))) {
    //...
    }
    

    【讨论】:

    • 谢谢!!!这解决了问题。最奇怪的是,只有 LLVM 对它挑剔。 GCC 在没有警告的情况下编译它。我开始使用 LLVM 来编译,而不是 GCC,我在这里和那里收到一些挑选错误......
    • @Digital Robot:我记得在某处读过专门说 LLVM 对此进行检查的地方。我认为有时对这些事情挑剔是件好事 :)
    • @Digital Robot - GCC 将在启用-Wparentheses 选项的情况下执行此操作(Xcode 中缺少大括号和括号警告)。我相信 LLVM 现在默认会这样做。
    • 为什么括号中的赋值会有所不同?
    • @dylam 这是一个明确的信号,表明您想在条件中使用赋值,而不是意外的忘记额外等号错误。并不是说上下文也不能帮助您确定这一点,而是额外的括号作为一个标志,表明这是有意的。这不是错误;这是一个警告。
    【解决方案2】:

    这应该是警告而不是错误。如果您使用的是=,但您的意思是==,它会尝试发出警告。

    在这种情况下,您不打算使用==,因为您多次调用va_arg() 以遍历otherButtonTitles 并将其分配给临时变量title,因此只需添加另一组括号。警告将消失。

    while((title = va_arg(args,NSString*))) {
    

    【讨论】:

      【解决方案3】:

      编译器认为您错误地进行了赋值,因此提示此错误。您应该将您的语句包装成一对括号,如下所示:

      while((title = va_arg(args,NSString*)))
      

      然后编译器首先会评估赋值,然后赋值的结果将被传递到while 条件中

      【讨论】:

        【解决方案4】:

        看起来确实有点挑剔,但是你试过了吗:

        while((title = va_arg(args,NSString*)) != NULL)
        

        ?

        【讨论】:

          猜你喜欢
          • 2011-11-27
          • 1970-01-01
          • 2012-11-09
          • 2014-07-31
          • 1970-01-01
          • 2023-03-19
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多