C語言 - 作用域規則



在任何程式語言中,作用域是指程式中定義的變數可以存在並被訪問的區域。在C語言中,變數可以在三個地方宣告:

  • 在函式或程式碼塊內部,稱為區域性變數。

  • 在所有函式外部,稱為全域性變數。

  • 在函式引數定義中,稱為形式引數。

讓我們瞭解一下區域性變數、全域性變數和形式引數。

區域性變數

在函式或程式碼塊內部宣告的變數稱為區域性變數。只有函式或程式碼塊內部的語句才能使用它們。區域性變數對於其自身函式外部的函式是未知的。

示例

以下示例顯示瞭如何使用區域性變數。這裡所有變數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

形式引數

形式引數在函式內部被視為區域性變數,並且優先於全域性變數。以下是一個例子:

示例

#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

區域性變數和全域性變數的初始化

定義區域性變數時,系統不會對其進行初始化,您必須自行初始化。當您按如下方式定義全域性變數時,系統會自動對其進行初始化:

資料型別 初始預設值
int 0
char '\0'
float 0
double 0
指標 NULL

良好的程式設計習慣是正確初始化變數,否則程式可能會產生意外的結果,因為未初始化的變數將採用其記憶體位置中已有的某些垃圾值。

廣告
© . All rights reserved.