如下程序:#include<iostream>#include<cstdlib>using namespace std;int main(){cout<<"Compute a random number?(y/n)";char ans;cin>>ans;if(ans=='n')goto done;int ran=rand();done:return 0;}為什么將語句:int ran=rand();改成:int ran; ran=rand();就對了?書中解釋為:一個需要初始化的變量,只要它在作用域內(nèi),就必須保證已經(jīng)對其進行過初始化了。怎樣理解這句話,修改前后的句子有什么不同?何謂初始化?謝謝回答!
3 回答

小怪獸愛吃肉
TA貢獻1852條經(jīng)驗 獲得超1個贊
int ran;
ran=rand();
不是初始化,它是聲明與賦值語句。
int ran=rand(); 聲明 時就 給定數(shù)值,叫初始化。
if(ans=='n') goto done; 轉(zhuǎn)向語句不允許 跳過一個 同一層的 含 初始化 的區(qū)域。
轉(zhuǎn)向語句只允許轉(zhuǎn)向它的同層或外層。如果你把初始化部分用花括號括起來,讓它成為一個內(nèi)層,就允許了:
if(ans=='n') goto done;
{ int ran=rand(); };
done: return 0;

蕭十郎
TA貢獻1815條經(jīng)驗 獲得超13個贊
這個基本上可以視為編譯器bug, intel編譯器也有這種問題,而微軟編譯器就沒有。
如果goto跳過的代碼含有初始化就會視為錯誤,即便這個變量在這種情形下根本不會被使用。這么做是毫無意義的...
int i = 0;這就是初始化,在聲明的時候用=賦予初始值。修改前后生成的代碼沒有區(qū)別。
- 3 回答
- 0 關注
- 949 瀏覽
添加回答
舉報
0/150
提交
取消