第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在哪里可以和不能在C中聲明新變量?

在哪里可以和不能在C中聲明新變量?

C
有只小跳蛙 2019-10-26 12:51:58
我(可能是從老師那里)聽說(shuō),應(yīng)該在程序/函數(shù)之上聲明所有變量,并且在聲明中聲明新變量可能會(huì)引起問(wèn)題。但是后來(lái)我讀了《 K&R》,我碰到了這句話:“變量的聲明(包括初始化)可能會(huì)在左括號(hào)后面加上任何復(fù)合語(yǔ)句,而不僅僅是開始一個(gè)函數(shù)的語(yǔ)句?!?他舉了一個(gè)例子:if (n > 0){    int i;    for (i=0;i<n;i++)    ...}我對(duì)這個(gè)概念有所了解,它甚至適用于數(shù)組。例如:int main(){    int x = 0 ;    while (x<10){        if (x>5){            int y[x];            y[0] = 10;            printf("%d %d\n",y[0],y[4]);        }        x++;    }}那么,什么時(shí)候才不允許我聲明變量?例如,如果我的變量聲明在右括號(hào)之后不正確怎么辦?像這兒:int main(){    int x = 10;    x++;    printf("%d\n",x);    int z = 6;    printf("%d\n",z);}根據(jù)程序/機(jī)器,這會(huì)引起麻煩嗎?
查看完整描述

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變量聲明。


查看完整回答
反對(duì) 回復(fù) 2019-10-26
?
不負(fù)相思意

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ì)使代碼混亂且難以理解。


查看完整回答
反對(duì) 回復(fù) 2019-10-26
?
ITMISS

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è)塊頂部的情況。


查看完整回答
反對(duì) 回復(fù) 2019-10-26
  • 3 回答
  • 0 關(guān)注
  • 554 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)