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后续每次调用方法都接收到值?

4

4 回答 4

3

那就是垃圾价值。

用一些值初始化它。

编辑:

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

用于自动垃圾值。

对于静态- 0。

对于全局/外部- 0;

用于注册垃圾。

在您的情况下,它是自动的。

哦哦!!!我想回答你的第二部分:(

为什么最初它是 0,后来是 32767。

您在该链接中正确指出,现在无需在此答案中解释。我能做的就是仅参考该链接。

未初始化的变量如何获得垃圾值?

于 2012-11-30T06:22:16.633 回答
1

在 Objective-C 中,唯一的保证是 int 至少为 32 位宽。这可以解释为什么它不是 0。至于为什么它是 32767,我没有最模糊的,但 32768 是 2 的幂,所以这可能会为答案提供线索。

于 2012-11-30T06:22:39.553 回答
1

除非您初始化局部自动变量,否则它们不会被初始化。不能假定它们具有任何特定价值。实例变量、静态变量和全局变量都初始化为0,但不是像这样的普通局部变量。在打算读取它的值之前,您需要自己初始化它

于 2012-11-30T06:22:42.250 回答
0

在堆栈上声明一个值不会初始化它。它只是为它分配空间。该内存中发生的任何值都是您将看到的打印值。如果你改为写:

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

那么它应该每次打印 0 。

于 2012-11-30T06:21:34.650 回答