Objective c 目标C中的条件语句究竟由什么构成?

Objective c 目标C中的条件语句究竟由什么构成?,objective-c,conditional,while-loop,Objective C,Conditional,While Loop,我一直在读《在Mac上学习目标C》一书,我在看下面的示例代码: #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSFileManager *manager; manager = [NSFileManager defaultManager]

我一直在读《在Mac上学习目标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
#导入
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSFileManager*管理器;
manager=[NSFileManager defaultManager];
NSString*主页;
home=[@“~”stringByExpandingTildeInPath];
NSDirectoryEnumerator*direnum;
direnum=[manager enumeratorpath:home];
NSMutableArray*文件;
files=[NSMutableArray阵列容量:42];
//“慢”枚举
NSString*文件名;
while(文件名=[direnum nextObject])
{
如果([[filename pathExtension]isEqualTo:@“jpg”])
{
[文件添加对象:文件名];
}//如果结束,则结束
}//结束时
n分子*filenum;
filenum=[files objectEnumerator];
而(文件名=[filenum nextObject])
{
NSLog(@“%@”,文件名);
}
[泳池排水沟];
返回0;
}//主要

对我来说最突出的是
while(filename=[filenum nextObject])
,我想,'这实际上是一个条件语句吗?'我想对
[filenum nextObject]
的调用是一个带有文件名的NSString,或者说是nil,但是我们在计算它时如何执行
filename=
?你能给我指一下正确的文档吗?它能更清楚地解释这里可能发生的事情吗?

这是一个条件语句,因为每个赋值都有一个值,右边的值分配给左边的var。 在本例中,最终值为有效的
NSString
对象或nil。 只要
nil
表示“nothing”,该条件就被解释为false,否则为true。

表达式

(file = [filenum nextObject])
将通过循环每次执行。在它被排除之后,它将作为if语句的布尔条件进行计算

这和正常的陈述一样,比如

x = 13 * 4;

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

这实际上是C的一个特性。while语句采用类似if语句的表达式,赋值是有效表达式。在中,您可以看到以下内容是有效的

IF '(' expression ')' statement
而且

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

while ( (filename = [direnum nextObject]) )

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

while ( obj = [enumerator nextObject] ) {
    printf( "%s\n", [[obj description] cString] );
}
while(obj=[array objectEnumerator])
之所以有效,是因为objectEnumerator在最后一个对象上返回nil。因为在C中,nil通常为0,这与false相同<代码>((obj=[array objectEnumerator])!=nil)可能更可取

资料来源:

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

而(filename=[filenum nextObject])

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

  • [filenum nextObject]
    方法被调用并返回NSString
  • filename=
    获取NSString的地址
  • filename
    的值作为
    的条件进行计算,而(…)
    操作
  • 正如您指出的,如果返回值为
    nil
    ,则filename等于
    nil
    ,条件的计算结果为false,否则filename为非零,条件的计算结果为true

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

    while(filename==[filenum nextObject])

    将原始语句写成

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


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

    那么
    (myVal=nil)
    会做什么呢?false,false,false(至少15个字符),这非常强大。您可以将整个应用程序粘贴到一段时间内。我得多读一点,嗯。当myVal,即nil,被赋值为nil时,如果你使用“(myVal=nil)”,你不会得到一个悖论?这里没有悖论。计算如下:首先将
    nil
    赋值给
    myVal
    ,然后计算最终的表达式值,即
    nil
    。我正在查看您提供的C语法文件链接,这非常有趣。它给我提出的问题比答案多,我会花一些时间来研究。。。但是像
    >=
    啊,是的>>=&=|=这些都是有趣的东西,它们用一个操作符进行位操作和赋值。例如,如果x=1,那么你做
    xoh,取001,然后把它改成100?这样就把它移到了3个槽口上?那么0000100011在这种情况下会变为01010001100?我相信这在某些地方是有用的,但我不知道现在在哪里。。。也许如果我想把二进制参数存储在一个整数中?这里偏离主题:),但是接近0001会变成1000,这是3个移位,你的例子是2个移位。这通常用于算法和加密(使用算法)。我肯定更喜欢它,因为它的可读性。。。但是,这种“一石二鸟”的概念不仅可以赋值,而且还可以求值,这看起来是一种很好的节省时间的方法,对于一个经验丰富的程序员来说可能更有意义,但这是可能的