在編程中,您經(jīng)常需要處理變量的作用域。變量的范圍決定了您是否可以在特定代碼塊內(nèi)訪問和修改它。在本教程中,您將了解 C 編程語言中的變量作用域。您將看到一些代碼示例,以幫助您了解局部變量和全局變量之間的差異。
變量的作用域是什么?
在繼續(xù)了解局部和全局變量作用域之前,讓我們了解作用域的含義。
簡單來說,變量的作用域就是它在程序中的生命周期。
這意味著變量的作用域是整個程序中變量被聲明、使用和可以修改的代碼塊。
在下一節(jié)中,您將了解變量的局部作用域
C 中變量的局部作用域——嵌套塊
在本節(jié)中,您將了解局部變量如何在 C 中工作。您將首先編寫幾個示例,然后概括作用域原則。
? 這是第一個例子:
#include <stdio.h>
int main()
{
int my_num = 7;
{
//add 10 my_num
my_num = my_num +10;
//or my_num +=10 - more succinctly
printf("my_num is %d",my_num);
}
return 0;
}
讓我們了解一下上面的程序是做什么的。
在 C 中,您用 {}分隔代碼塊。左花括號和右花括號分別表示塊的開始和結(jié)束。
- 該main()函數(shù)有一個整數(shù)變量my_num,它在外部塊中初始化為 7 。
- 有一個內(nèi)部塊試圖將 10 添加到變量my_num。
現(xiàn)在,編譯并運行上面的程序。這是輸出:
//Output
my_num is 17
您可以看到以下內(nèi)容:
- 內(nèi)部塊能夠訪問my_num在外部塊中聲明的值,并通過向其添加 7 來修改它。
- 的值my_num現(xiàn)在是 17,如輸出中所示。
C 中變量的局部范圍——嵌套塊示例 2
? 這是另一個相關(guān)的例子:
#include <stdio.h>
int main()
{
int my_num = 7;
{
int new_num = 10;
}
printf("new_num is %d",new_num); //this is line 9
return 0;
}
- 在這個程序中,main()函數(shù)my_num在外部塊中有一個整數(shù)變量。
- 另一個變量new_num在內(nèi)部塊中初始化。內(nèi)部塊嵌套在外部塊內(nèi)。
- 我們試圖new_num在外部塊中訪問和打印內(nèi)部塊的值。
如果您嘗試編譯上面的代碼,您會注意到它沒有成功編譯。您將收到以下錯誤消息:
Line Message
9 error: 'new_num' undeclared (first use in this function)
這是因為變量new_num是在內(nèi)部塊中聲明的,其作用域僅限于內(nèi)部塊。換句話說,它對于內(nèi)部塊是本地的,不能從外部塊訪問。
基于上述觀察,讓我們寫下以下變量局部作用域的通用原則:
{
/*OUTER BLOCK*/
{
//contents of the outer block just before the start of this block
//CAN be accessed here
/*INNER BLOCK*/
}
//contents of the inner block are NOT accessible here
}
C 中變量的局部作用域——不同的塊
在前面的示例中,您了解了如何無法從塊外部訪問嵌套內(nèi)部塊中的變量。
在本節(jié)中,您將了解在不同塊中聲明的變量的局部作用域。
#include <stdio.h>
int main()
{
int my_num = 7;
printf("%d",my_num);
my_func();
return 0;
}
void my_func()
{
printf("%d",my_num);
}
在上面的例子中,
- 整型變量my_num在main()函數(shù)內(nèi)部聲明。
- 在main()函數(shù)內(nèi)部,my_num打印出的值。
- 還有另一個函數(shù)my_func()試圖訪問和打印 my_num的值。
- 當程序從main()函數(shù)開始執(zhí)行時,會調(diào)用到函數(shù)my_func()內(nèi)部main()。
? 現(xiàn)在編譯并運行上述程序。您將收到以下錯誤消息:
Line Message
13 error: 'my_num' undeclared (first use in this function)
如果您注意到 on line 13,該函數(shù)my_func()嘗試訪問在my_num函數(shù)內(nèi)部聲明和初始化的main()變量。
因此,變量的作用域my_num被限制在main()函數(shù)內(nèi),被稱為函數(shù)局部的main()。
我們可以將這種局部作用域的概念一般性地表示如下:
{
/*BLOCK 1*/
// contents of BLOCK 2 cannot be accessed here
}
{
/*BLOCK 2*/
// contents of BLOCK 1 cannot be accessed here
}
C 中變量的全局范圍
到目前為止,您已經(jīng)了解了 C 變量的局部作用域。在本節(jié)中,您將學(xué)習(xí)如何在 C 中聲明全局變量。
? 讓我們從一個例子開始。
#include <stdio.h>
int my_num = 7;
int main()
{
printf("my_num can be accessed from main() and its value is %d\n",my_num);
//call my_func
my_func();
return 0;
}
void my_func()
{
printf("my_num can be accessed from my_func() as well and its value is %d\n",my_num);
}
在上面的例子中,
- 該變量my_num在函數(shù)main()和之外聲明my_func()。
- 我們嘗試訪問函數(shù)my_num內(nèi)部main(),并打印其值。
- 我們在函數(shù)my_func()內(nèi)部調(diào)用main()函數(shù)。
- 該函數(shù)my_func()還嘗試訪問 的值my_num,并將其打印出來。
該程序編譯沒有任何錯誤,輸出如下所示:
//Output
my_num can be accessed from main() and its value is 7
my_num can be accessed from my_func() as well and its value is 7
在這個例子中,有兩個函數(shù) -main()和my_func()。
然而,該變量my_num不在兩個這兩個函數(shù)中。這種對任何函數(shù)都不是局部的變量被稱為具有全局作用域,稱為全局變量。
這個全局變量作用域的原理可以總結(jié)如下:
//all global variables are declared here
function1()
{
// all global variables can be accessed inside function1
}
function2()
{
// all global variables can be accessed inside function2
}