Objective c 目标C中的条件语句究竟由什么构成?
我一直在读《在Mac上学习目标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]
#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]
方法被调用并返回NSStringfilename=
获取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个移位。这通常用于算法和加密(使用算法)。我肯定更喜欢它,因为它的可读性。。。但是,这种“一石二鸟”的概念不仅可以赋值,而且还可以求值,这看起来是一种很好的节省时间的方法,对于一个经验丰富的程序员来说可能更有意义,但这是可能的