scope / 作用域(C變量的作用域)
參考:C Primer Plus 第6版 第12章 存儲類別、鏈接和內(nèi)存管理
-
scope / 作用域(C變量的作用域)
- 1. 定義
-
2. 分類
-
2.1. block scope / 塊作用域
- 2.1.1. 定義
- 2.1.2. 函數(shù)的形式參數(shù)
- 2.1.3. 沒有花括號的塊
- 2.2. function scope / 函數(shù)作用域
- 2.3. function prototype scope / 函數(shù)原型作用域
- 2.4. file scope / 文件作用域
-
2.1. block scope / 塊作用域
- 3. 總結(jié)
1. 定義
描述程序中可以訪問identifier(標(biāo)識符)的區(qū)域
2. 分類
scope可以分為四類:
2.1. block scope / 塊作用域
2.1.1. 定義
- block/塊是用一塊花括號括起來的代碼區(qū)域
- 塊作用域變量的范圍是從定義處到包含該定義塊的末尾
- 聲明在內(nèi)層塊中的變量,其作用域僅局限于該聲明所在的塊
2.1.2. 函數(shù)的形式參數(shù)
- 雖然函數(shù)的形式參數(shù)聲明在函數(shù)的花括號之前,但是它們也具有塊作用域,屬于函數(shù)體這個塊
2.1.3. 沒有花括號的塊
之前,具有塊作用域的變量都必須聲明在塊的開頭,C99標(biāo)準(zhǔn)放開了這個限制:作為循環(huán)或者if語句的一部分,即便不使用花括號,也是一個塊。
所以for循環(huán)語句可以這樣定義:for(int i=0; i<10; i++)
更完整地說,整個循環(huán)是它所在塊的子塊,循環(huán)體是整個循環(huán)塊的子塊;if語句是一個塊,與其相關(guān)聯(lián)的子語句是if語句的子塊,這其中包含著一種嵌套關(guān)系。
#include <stdio.h>
int main()
{
int n = 8;
printf("Initially, n = %d at %p\n", n, &n);
for (int n = 1; n < 3; n++)
printf("loop 1: n = %d at %p\n", n, &n);
printf("After loop 1, n = %d at %p\n", n, &n);
for (int n = 1; n < 3; n++)
{
printf("loop 2 index n: n = %d at %p\n", n, &n);
int n = 6;
printf("loop 2: n = %d at %p\n", n, &n);
n++;
}
printf("After loop 2, n = %d at %p\n", n, &n);
return 0;
}
該程序的輸出如下:
Initially, n = 8 at 000000950FDFF6D4
loop 1: n = 1 at 000000950FDFF6F4
loop 1: n = 2 at 000000950FDFF6F4
After loop 1, n = 8 at 000000950FDFF6D4
loop 2 index n: n = 1 at 000000950FDFF714
loop 2: n = 6 at 000000950FDFF734
loop 2 index n: n = 2 at 000000950FDFF714
loop 2: n = 6 at 000000950FDFF734
After loop 2, n = 8 at 000000950FDFF6D4
進入循環(huán)之后,隱藏了原有的n;
然后在循環(huán)體中又聲明了一個n,隱藏了索引n;
循環(huán)單次迭代結(jié)束之后,聲明在循環(huán)體中的n消失,循環(huán)頭仍調(diào)用到索引n;
當(dāng)整個循環(huán)完成之后,原始的n重新起作用。
簡而言之,索引n的作用域是整個循環(huán),而定義在循環(huán)體中變量n的作用域只有單個循環(huán)。
?。?!沒必要在程序中使用相同的變量名
2.2. function scope / 函數(shù)作用域
- 僅用于goto語句的標(biāo)簽
- 即使一個標(biāo)簽首次出現(xiàn)在函數(shù)的內(nèi)層塊中,它的作用域也將延伸至整個函數(shù)(是整個函數(shù)而非塊)
- 標(biāo)簽的函數(shù)作用域防止在兩個塊中使用相同的標(biāo)簽所導(dǎo)致的混亂
2.3. function prototype scope / 函數(shù)原型作用域
參考:CSDN博客,但是它函數(shù)作用域?qū)戝e了文章來源:http://www.zghlxwxcb.cn/news/detail-825020.html
- 用于函數(shù)原型中的形參名
- 函數(shù)原型作用域的范圍是從形參定義處到原型聲明結(jié)束(可以理解為小括號內(nèi))
- 函數(shù)原型聲明中的標(biāo)識符可以與函數(shù)定義中說明的標(biāo)識符名稱不同,只要讓函數(shù)聲明和函數(shù)定義中小括號內(nèi)每個變量的類型及數(shù)目一致即可,也可以省略掉參數(shù)名。
double max(double x, double y);
double max(double, double);
//兩者均可
2.4. file scope / 文件作用域
- 從定義處到該定義所在的文件末尾均可見
- 文件作用域變量也被稱作全局變量 global variable
3. 總結(jié)
- scope的定義
- scope的分類以及各自的含義
Others:文章來源地址http://www.zghlxwxcb.cn/news/detail-825020.html
- goto標(biāo)簽如何使用?
- 什么是函數(shù)原型?
到了這里,關(guān)于scope / 作用域(C變量的作用域)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!