3 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
我也經(jīng)常聽到把變量放在函數(shù)頂部是最好的處理方法,但是我非常不同意。我更喜歡將變量限制在盡可能小的范圍內(nèi),這樣變量被濫用的機(jī)會(huì)就更少了,因此,在程序的每一行中填滿我的思維空間的東西也就更少了。
盡管所有版本的C都允許詞法塊作用域,但是您可以在其中聲明變量取決于目標(biāo)C語(yǔ)言版本:
從C99開始或C ++
諸如gcc和clang之類的現(xiàn)代C編譯器支持C99和C11標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)允許您在可能進(jìn)行語(yǔ)句的任何地方聲明變量。變量的范圍從聲明的點(diǎn)開始到塊的末尾(下一個(gè)大括號(hào))。
if( x < 10 ){
printf("%d", 17); // z is not in scope in this line
int z = 42;
printf("%d", z); // z is in scope in this line
}
您還可以在for循環(huán)初始化程序中聲明變量。該變量?jī)H在循環(huán)內(nèi)部存在。
for(int i=0; i<10; i++){
printf("%d", i);
}
ANSI C(C90)
如果您以較早的ANSI C標(biāo)準(zhǔn)為目標(biāo),則僅限于在括號(hào)1之后立即聲明變量。
但這并不意味著您必須在函數(shù)頂部聲明所有變量。在C語(yǔ)言中,您可以將大括號(hào)分隔的塊放在語(yǔ)句可以到達(dá)的任何位置(不僅在諸如if或之后for),并且可以使用它引入新的變量作用域。以下是以前的C99示例的ANSI C版本:
if( x < 10 ){
printf("%d", 17); // z is not in scope in this line
{
int z = 42;
printf("%d", z); // z is in scope in this line
}
}
{int i; for(i=0; i<10; i++){
printf("%d", i);
}}
1請(qǐng)注意,如果您使用的是gcc,則需要傳遞該--pedantic標(biāo)志以使其實(shí)際上執(zhí)行C90標(biāo)準(zhǔn),并抱怨變量聲明在錯(cuò)誤的位置。如果只使用-std=c90它,它將使gcc接受C90的超集,該超集還允許更靈活的C99變量聲明。

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
missingno介紹了ANSI C允許的內(nèi)容,但是他沒有說(shuō)明為什么您的老師告訴您在函數(shù)頂部聲明變量。在奇怪的地方聲明變量會(huì)使您的代碼更難閱讀,并且可能導(dǎo)致錯(cuò)誤。
以下面的代碼為例。
#include <stdio.h>
int main() {
int i, j;
i = 20;
j = 30;
printf("(1) i: %d, j: %d\n", i, j);
{
int i;
i = 88;
j = 99;
printf("(2) i: %d, j: %d\n", i, j);
}
printf("(3) i: %d, j: %d\n", i, j);
return 0;
}
如您所見,我已經(jīng)聲明了i兩次。好吧,更準(zhǔn)確地說(shuō),我已經(jīng)聲明了兩個(gè)變量,兩個(gè)變量的名稱均為i。您可能會(huì)認(rèn)為這會(huì)導(dǎo)致錯(cuò)誤,但是不會(huì),因?yàn)閮蓚€(gè)i變量的作用域不同。當(dāng)您查看此函數(shù)的輸出時(shí),可以更清楚地看到這一點(diǎn)。
(1) i: 20, j: 30
(2) i: 88, j: 99
(3) i: 20, j: 99
首先,我們分別為i和分配20和30 j。然后,在花括號(hào)內(nèi),我們指定88和99。那么,為什么要j保留其值,但又i回到20?這是由于兩個(gè)不同的i變量。
在花括號(hào)的內(nèi)部集合之間,i值20 的變量是隱藏的并且不可訪問(wèn),但是由于我們尚未聲明new j,因此我們?nèi)栽谑褂胘外部作用域。當(dāng)我們離開內(nèi)部一組花括號(hào)時(shí),i保持值88消失,我們?cè)俅慰梢栽L問(wèn)i具有值20的。
有時(shí)候,這種行為是件好事,而有時(shí)卻不是。但是應(yīng)該清楚的是,如果不加選擇地使用C的此功能,則確實(shí)會(huì)使代碼混亂且難以理解。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
帖子顯示以下代碼:
//C99
printf("%d", 17);
int z=42;
printf("%d", z);
//ANSI C
printf("%d", 17);
{
int z=42;
printf("%d", z);
}
我認(rèn)為這意味著它們是等效的。他們不是。如果將int z放置在此代碼段的底部,則會(huì)對(duì)第一個(gè)z定義(而不對(duì)第二個(gè)z定義)引起重新定義錯(cuò)誤。
但是,以下幾行:
//C99
for(int i=0; i<10; i++){}
確實(shí)有效。顯示了此C99規(guī)則的微妙之處。
就個(gè)人而言,我熱情地避免使用此C99功能。
如這些示例所示,它縮小變量范圍的說(shuō)法是錯(cuò)誤的。根據(jù)新規(guī)則,在掃描完整個(gè)塊之前,您不能安全地聲明變量,而以前,您只需要了解每個(gè)塊頂部的情況。
- 3 回答
- 0 關(guān)注
- 554 瀏覽
添加回答
舉報(bào)