Saturday, September 1, 2018

C - スコープルール

プログラミングのスコープとは、定義された変数が存在し、その変数を超えてアクセスできない領域です。 Cプログラミング言語で変数を宣言できる場所は3つあります。

  • ローカル変数と呼ばれる関数またはブロックの内部。
  • グローバル変数と呼ばれるすべての関数の外側。
  • 形式パラメータと呼ばれる関数パラメータの定義において。
  • ローカル変数とグローバル変数、および仮パラメータについて理解してみましょう。


ローカル変数

関数またはブロック内で宣言された変数はローカル変数と呼ばれます。 それらは、その関数またはコードブロックの内部にあるステートメントによってのみ使用できます。 ローカル変数は、それ自身の外で機能することは知られていません。 次の例は、ローカル変数の使用方法を示しています。 ここでは、すべての変数a、b、およびcはmain()関数に対してローカルです。
#include <stdio.h>
 
int main () {

  /* local variable declaration */
  int a, b;
  int c;
 
  /* actual initialization */
  a = 10;
  b = 20;
  c = a + b;
 
  printf ("value of a = %d, b = %d and c = %d\n", a, b, c);
 
  return 0;
}

グローバル変数
大域変数は関数の外側で定義され、通常はプログラムの上に定義されます。 グローバル変数は、プログラムの存続期間を通じてその値を保持し、プログラムに定義されている関数のいずれかでアクセスできます。

グローバル変数には、どの関数でもアクセスできます。 つまり、グローバル変数は、宣言後にプログラム全体で使用できるようになります。 次のプログラムは、グローバル変数がプログラムでどのように使用されるかを示しています。

#include <stdio.h>
 
/* global variable declaration */
int g;
 
int main () {

  /* local variable declaration */
  int a, b;
 
  /* actual initialization */
  a = 10;
  b = 20;
  g = a + b;
 
  printf ("value of a = %d, b = %d and g = %d\n", a, b, g);
 
  return 0;
}
プログラムはローカル変数とグローバル変数に同じ名前を付けることができますが、関数内のローカル変数の値が優先されます。 ここに例があります

#include <stdio.h>
 
/* global variable declaration */
int g = 20;
 
int main () {

  /* local variable declaration */
  int g = 10;
 
  printf ("value of g = %d\n",  g);
 
  return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます
value of g = 10


形式的なパラメータ
形式的なパラメータは、関数内の-lでローカル変数として扱われ、グローバル変数よりも優先されます。 以下は例です
#include <stdio.h>
 
/* global variable declaration */
int a = 20;
 
int main () {

  /* local variable declaration in main function */
  int a = 10;
  int b = 20;
  int c = 0;

  printf ("value of a in main() = %d\n",  a);
  c = sum( a, b);
  printf ("value of c in main() = %d\n",  c);

  return 0;
}

/* function to add two integers */
int sum(int a, int b) {

   printf ("value of a in sum() = %d\n",  a);
   printf ("value of b in sum() = %d\n",  b);

   return a + b;
}

上記のコードをコンパイルして実行すると、次の結果が生成されます
value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30

ローカル変数とグローバル変数の初期化
ローカル変数が定義されている場合、ローカル変数はシステムによって初期化されていないので、自分で初期化する必要があります。 グローバル変数は、以下のように定義すると、システムによって自動的に初期化されます

Data TypeInitial Default Value
int0
char'\0'
float0
double0
pointerNULL
初期化されていない変数は、メモリ位置ですでに使用可能なガベージ値を取るため、変数を適切に初期化することは良いプログラミング慣行です。そうしないと、予期しない結果が生じる可能性があります。






No comments:

Post a Comment

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...