2012-11-30 120 views
0

考虑下面的Objective-C代码:这个局部变量的值为什么会改变?

@interface ClassA : NSObject { 

} 
-(void) printVal; 
@end 


@implementation ClassA 
-(void) printVal { 
    int val; 
    NSLog(@"%i", val); 
} 
@end 


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

    ClassA* cA = [[ClassA alloc] init]; 
    [cA printVal]; 
    [cA printVal]; 
    [cA printVal]; 

    [pool drain]; 
    return 0; 
} 

为什么是这样的输出:

2012-11-29 22:12:06.586 TestOne[20266:903] 0 
2012-11-29 22:12:06.587 TestOne[20266:903] 32767 
2012-11-29 22:12:06.588 TestOne[20266:903] 32767 

换句话说,为什么当它被重新声明是val没有被重新初始化为0,为什么它收到在随后每调用一次方法时值32767

+0

这不是一个Objective-C问题。这是一个C问题。 Objective-C是C(通常被遗忘的事实)......考虑阅读K&R;这是一个很棒的阅读。 – matt

+0

@matt,我想它可能是,但我更加不熟悉C,而不是Obj-C。在问题中添加了'c'标签。 – ericsoco

回答

3

这是垃圾值。

用一些值初始化它。

编辑:

存储类型说明符有一些默认值

的自动垃圾值。

for static- 0.

for global/extern-0;

注册垃圾。

在你的情况它是自动的。

OHHH !!!我fotgot回答你的第二个部分:(

为什么最初它来为0,后来有些32767

你在这个链接,现在没必要在这个答案,解释正确地指出,该怎么做的是仅指该链接。

How does an uninitiliazed variable get a garbage value?

+0

对不起。不明白你的垃圾价值是什么意思,但重新阅读我认为这回答了这个问题。你有更多关于垃圾价值的知识吗?只是好奇。 – ericsoco

+0

参考任何c或C++书,它是重要的话题之一。在面试和源代码中经常会要求您解决并找到结果类型的考试。 –

+0

,刚刚发现这个:http://stackoverflow.com/questions/1422729/how-an-uninitialised-variable-gets-a-garbage-value但是,我很急于接受你的答案 - 为什么要调用方法第二次用垃圾值填充未初始化的变量,而第一次调用该方法时它包含0。 – ericsoco

0

声明堆栈上的值不会初始化它。它只是为它分配空间。无论在这个记忆中发生什么样的价值都是你将会看到的价值。如果你写道:

-(void)printVal 
{ 
    int val = 0; 
    NSLog (@"%i", val); 
} 

那么它应该每次打印0。

1

在Objective-C,the only guarantee you have is that an int will be at least 32-bits wide。这可能去解释它为什么不为0,为什么它是32767,我一点都不知道,但32768是2的幂,这样可能会给答案提供线索。

+0

我现在明白了,局部变量必须被初始化。所以,除此之外,我想我的问题基本上属于琐事领域。不过,我很好奇,价值会因为曾经被访问而改变。 – ericsoco

1

除非您初始化本地自动变量,否则不会初始化它们。他们不能被认为具有任何特殊价值。实例变量,静态变量和全局变量被初始化为0,但不是像这样的普通本地人。你需要在你打算读取它的值之前自行初始化它

相关问题