【问题标题】:what exactly constitutes a conditional statement in Objective C?什么是Objective C中的条件语句?
【发布时间】:2011-10-04 16:45:13
【问题描述】:

我一直在阅读在 Mac 上学习 Objective C 这本书, 我正在查看以下示例代码:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSFileManager *manager;
    manager = [NSFileManager defaultManager];

    NSString *home;
    home = [@"~" stringByExpandingTildeInPath];

    NSDirectoryEnumerator *direnum;
    direnum = [manager enumeratorAtPath: home];

    NSMutableArray *files;
    files = [NSMutableArray arrayWithCapacity: 42];

    // “Slow” enumeration
    NSString *filename;
    while ( filename = [direnum nextObject] )
    {
            if ([[filename pathExtension] isEqualTo: @”jpg”])
            {
                    [files addObject: filename];
            } // end if
    } // end while


    NSEnumerator *filenum;
    filenum = [files objectEnumerator];

    while ( filename = [filenum nextObject] )
    {
            NSLog(@”%@”, filename);
    }

[pool drain];
return 0;
} // main

对我来说最突出的是while ( filename = [filenum nextObject] ),我想,'这实际上是一个条件语句吗?'我想对[filenum nextObject] 的调用是一个带有文件名或nil 的NSString,但是我们如何在评估它时执行filename =?您能否指出正确的文档,以便更清楚地解释这里的可能性?

【问题讨论】:

    标签: objective-c conditional while-loop


    【解决方案1】:

    这是一个条件语句,因为每个赋值都有一个值,即右侧的值分配给左侧的 var。 在这种情况下,最终值是有效的NSString 对象,或者是 nil。 只要nil代表“无”,则条件被解释为假,否则为真。

    【讨论】:

    • 那么(myVal=nil) 会做什么呢?
    • 假,假,假(最少 15 个字符)
    • 所以这非常强大。您可以将整个应用程序放入有条件的一段时间。我将不得不阅读更多内容。
    • 嗯。如果 myVal(即 nil)被分配为 nil 为 TRUE 时执行 `(myVal=nil)',您不会遇到悖论?
    • 这里没有悖论。这被评估如下:首先将nil分配给myVal,然后评估最终的表达式值,即nil
    【解决方案2】:

    表达式

    (file = [filenum nextObject])
    

    每次循环都会执行。在它被执行后,它被评估为 if 语句的布尔条件

    和普通语句一样

    x = 13 * 4;
    

    等号右边的所有内容都被执行,然后分配给变量x。

    【讨论】:

      【解决方案3】:

      这实际上是 C 的一个特性。while 语句接受一个类似于 if 语句的表达式,而赋值是一个有效的表达式。在this C grammar file你可以看到以下是有效的

      IF '(' expression ')' statement
      

      还有

      WHILE '(' expression ')' statement
      

      只要表达式的结果不为零,条件就会为真。 nil 值为 0,将导致条件失败。一旦枚举器完成,nextObject 将返回 nil 并且条件将失败。但是,建议在将赋值作为条件表达式进行时,您应该用括号将其括起来以说明您的意图。

      while ( (filename = [direnum nextObject]) )
      

      【讨论】:

      • 我正在查看您提供的 C 语法文件链接,它非常有趣。对我来说,它提出的问题多于答案,我会花一些时间来查看......但是像&gt;&gt;=&lt;&lt;=这样的东西突然出现了......也许我会问另一个问题如果我找不到首先详细说明。
      • 啊是的 >>= &= |= 所有有趣的东西,这些都用一个操作符进行位操作和赋值。例如,如果 x = 1,那么您执行 x &lt;&lt;= 3 x 将等于 8。
      • 哦,那是把 001 改成 100 吗?从而将其移动超过 3 个等级?所以 00010100011 在这种情况下会变成 01010001100?我确定这在某处很有用,但我现在不知道在哪里......也许我想将二进制参数存储在一个整数中?
      • 离开主题 :) 在这里,但关闭 0001 将变为 1000,这是 3 个班次,您的示例是 2 个班次。而这常用于算法和加密(其中使用算法)。
      【解决方案4】:

      你提出了一个很好的问题。考虑代码

      while ( obj = [enumerator nextObject] ) {
          printf( "%s\n", [[obj description] cString] );
      }
      

      while ( obj = [array objectEnumerator] ) 起作用的原因是 objectEnumerator 在最后一个对象上返回 nil。由于在 C 中 nil 通常为 0,因此这与 false 相同。 ( ( obj = [array objectEnumerator] ) != nil ) 可能更可取

      来源: Click This Link

      在您的情况下,((filename = [direnum nextObject]) ) 是另一种避免编译器错误的方法。

      【讨论】:

      • nil在C中不存在,但在Objective-C中,它是always,而不是“通常”,0。定义为((void *)0)
      【解决方案5】:

      while ( filename = [filenum nextObject] )

      这个语句很复杂,执行多个操作。

      1. [filenum nextObject] 方法被调用并返回一个 NSString
      2. filename = 被分配了 NSString 的地址
      3. filename 的值被评估为while ( ... ) 的条件 操作

      正如您所指出的,如果返回值为nil,则文件名等于nil,并且条件评估为假,否则文件名非零且条件评估为真。

      许多程序员不喜欢这种语法。它很简洁,可能难以维护。当开发人员实际打算比较两个值时,编译器会生成一个警告,以标记常见的语法错误,

      while ( filename == [filenum nextObject] )

      将原始语句写成

      会更简洁

      while ( (filename = [filenum nextObject]) != nil )

      此语句的行为与原始语句相同,但消除了赋值和条件操作的歧义。

      【讨论】:

      • 我绝对更喜欢它,因为它的可读性......但是这种“用一块石头杀死两只鸟”的概念不仅要分配一个值,还要评估它看起来像一个很好的节省时间的方法这对经验丰富的程序员可能更有意义,但对于像我这样的初学者来说可能会有问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 2014-05-19
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多