java強(qiáng)制類型轉(zhuǎn)換 在c語(yǔ)言中,局部變量初始化是什么意思,要怎么初始化?
在c語(yǔ)言中,局部變量初始化是什么意思,要怎么初始化?C語(yǔ)言按范圍一般分為全局變量和局部變量。一旦聲明了全局變量,默認(rèn)情況下它將被初始化為適當(dāng)?shù)念愋?,而當(dāng)聲明了局部變量時(shí),它的值是不可預(yù)測(cè)的。因此,對(duì)
在c語(yǔ)言中,局部變量初始化是什么意思,要怎么初始化?
C語(yǔ)言按范圍一般分為全局變量和局部變量。一旦聲明了全局變量,默認(rèn)情況下它將被初始化為適當(dāng)?shù)念愋?,而當(dāng)聲明了局部變量時(shí),它的值是不可預(yù)測(cè)的。因此,對(duì)于后續(xù)程序的正常使用,最好是將其初始化得恰到好處,否則有時(shí)會(huì)造成災(zāi)難性的后果!第二個(gè)問(wèn)題,例如:intmain(){Chara;//未初始化。以后可以初始化。Char*P=&A;//已初始化。指針P給定了變量a的地址,char*q;//未初始化。太危險(xiǎn)了!因?yàn)橹羔榪是一個(gè)局部變量,此時(shí)的值是不確定的,它可能指向系統(tǒng)的重要數(shù)據(jù)。一旦在初始化此變量之前遇到類似于以下的語(yǔ)句,就很危險(xiǎn):q=&A;}
錯(cuò)誤。變量是否需要初始化是按需完成的。有時(shí)需要初始化全局變量,但大多數(shù)情況下局部變量沒(méi)有初始化。不要混淆初始值賦值和初始化:初始化是由編譯器完成的。可執(zhí)行文件形成后,這些變量的值放在軟件文件中,在執(zhí)行程序時(shí)直接使用;而初始值的賦值是用C/C代碼實(shí)現(xiàn)的,變量的值只有在程序開(kāi)始執(zhí)行后才賦值。只有當(dāng)全局變量沒(méi)有顯式初始化時(shí),編譯器才會(huì)在編譯時(shí)自動(dòng)將其初始化為0,并且編譯器不會(huì)看到局部變量是否有值,因此在程序開(kāi)始執(zhí)行之前,局部變量的“值”是機(jī)器垃圾。因此,局部變量在初始值之前的正確使用時(shí)間將是一個(gè)問(wèn)題!有兩種方法可以獲得局部變量的初始值:一種是初始化,例如intx=3,當(dāng)聲明X的類型時(shí),它被初始化為3--X==3。這個(gè)值在編譯時(shí)由編譯器決定,程序啟動(dòng)后不會(huì)執(zhí)行intx=3的操作;
另一個(gè)是賦一個(gè)初始值,比如intxx=3,編譯時(shí)執(zhí)行,只聲明變量類型,值是垃圾,x=3是C/C語(yǔ)句,每次程序啟動(dòng)時(shí),變量x被分配給3。因此,說(shuō)“局部變量大部分時(shí)間不初始化”意味著當(dāng)我們創(chuàng)建一個(gè)函數(shù)時(shí),我們只寫(xiě)Ta、B、C、x、y、Z,而不是用某個(gè)值初始化每個(gè)變量,而是在使用之前給它們賦值,比如scanf(%d%d%d”、&A、&B、&AmpC)或for(x=0x<10x){…}(其中x=0)是將初始值賦給x),等等。
為什么全局變量無(wú)須初始化,局部變量必須初始化?
當(dāng)局部變量未初始化并且在第一次賦值之前引用了該變量的值時(shí),將報(bào)告使用未初始化局部變量的警告或錯(cuò)誤。
局部變量以
type var=init的形式定義,其含義是定義一個(gè)類型為var的局部變量,并將其初始化為init value。
其中,=init值部分可以省略。此時(shí),VaR的初始值將是一個(gè)隨機(jī)值,由編譯器或運(yùn)行環(huán)境決定。
如果初始值未知的VaR是由
type VaR
定義的,并且其值在賦值前被引用,例如打印、參與計(jì)算等,則VaR的值是不確定的。從某種意義上說(shuō),此時(shí)輸出什么值對(duì)程序的結(jié)果沒(méi)有意義。
因此,如果發(fā)生這種情況,編譯器將發(fā)出警告或錯(cuò)誤,以提醒存在這種不確定因素。
對(duì)于大多數(shù)編譯器來(lái)說(shuō),這只是一個(gè)警報(bào),而不是一個(gè)錯(cuò)誤。