0

関数で使用される自動 ストレージは、 autoキーワードを使用して宣言されたi変数を再初期化しません。


Practice.c : main() と func() はPractice.cにあります

#include <stdio.h>

main()
{
  func();
  func();
  func();
}


func()
{
  auto int i=1;
  printf("  i = %d",i);
  i=i+1;
}

コンパイル後にPractice.exeを実行すると、出力は次のようになります。

i = 1
i = 1
i = 1

main()がfunc( )を呼び出すたびに、i は 1 に再初期化されます。iのスコープはfunc()ブロック内にあり、制御がこのブロックから出るとiの値が失われるため、これは正しいことです。したがって、このfunc()関数を 2 回目に呼び出すと、 iの値が1に再初期化されます。

次のNew.cプログラムを確認してください。

New.c : main()func()の両方を含む

#include <stdio.h>

main()
{
  func();
  func();
  func();
  func();
  func();
  func();
  func();
  func();  
}


func()
{
  auto int i;
  printf("  i = %d",i);
  i=i+1;
}

念のため、関数func()を8 回呼び出しました。ただし、New.c では、 iは初期化されません。コンパイル後にこのプログラムを実行すると、出力は次のようになります。

i = 4201582
i = 4201583
i = 4201584
i = 4201585
i = 4201586
i = 4201587
i = 4201588
i = 4201589

出力は、呼び出しごとに増分を示します。この背後にある正確な理由は何ですか?

4

2 に答える 2

1

出力は、呼び出しごとに増分を示します。この背後にある正確な理由は何ですか?

自動ストレージ割り当ての変数はデフォルトでは初期化されず、初期化されていない変数にアクセスする動作は未定義です。これは、2 番目のプログラムの動作を推論できないことを意味します。

また、関数スコープ内の変数のデフォルトのストレージ クラスは自動であることに注意してください。autoしたがって、の定義を修飾するキーワードは必要ありませんi

// in function scope

auto int i;
// equivalent to
int i;

また、言うのは間違っています

したがって、この func() 関数を 2 回目に呼び出すと、i の値が 1 に再初期化されます。

変数iは再初期化されません。それを含む関数が戻ると、スコープ外になります。関数が再度呼び出されると、再びスタックに割り当てられます。これは、同じメモリ アドレスに割り当てられているという意味ではありません。

また、関数の戻り値の型とパラメーター リストにも注意する必要があります。暗黙の戻り値の型はintであり、空のパラメーター リストは、引数の数と型に関する情報が利用できないことを意味します。つまり、関数は固定されているが不明な数の未知の型の引数を取ることを意味します。void関数が引数を取らないことを意味するために、パラメーター リストで常に明示的に言及する必要があります。

#include <stdio.h>

// prototype of the function func
void func(void);

// main should have one of the below signatures - 
// int main(void); or 
// int main(int argc, char *argv[]);
int main(void)
{
  func();
  func();
  func();
}

// explicitly mention void in the 
// parameter list to mean the function
// takes no argument
void func(void)
{
  // using auto keyword is redundant because 
  // local variables have automatic storage allocation
  int i = 1;
  printf("i = %d", i);
  i = i + 1;
}
于 2014-05-07T06:30:57.750 に答える
0

2 番目のケースでは、i初期化せずに使用します。

したがって、値は言語によって定義されていません。値が増加するパターンが見られるという事実は、使用している特定のコンパイラの成果物です。

最初の反復では、ランダムに見える値がたまたまi表されるメモリ位置にあります。関数がそのメモリ位置の値をインクリメントすると、そのメモリ位置がたまたま後続の呼び出しに使用されます。

于 2014-05-07T06:29:56.567 に答える