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

それはゴミの価値です。

何らかの値で初期化します。

編集:

ストレージ クラス指定子には、次のようなデフォルト値があります。

自動ガベージ値。

static-0 の場合。

グローバル/extern-0 の場合。

レジスタガベージ用。

あなたの場合、それは自動です。

ああああ!!! 私はあなたの2番目の部分に答えるのを忘れました:(

なぜ最初は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 に答える