亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

簡單C++問題,關于goto語句的錯誤用法?

簡單C++問題,關于goto語句的錯誤用法?

繁星點點滴滴 2019-02-21 19:15:28
如下程序:#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();就對了?書中解釋為:一個需要初始化的變量,只要它在作用域內,就必須保證已經對其進行過初始化了。怎樣理解這句話,修改前后的句子有什么不同?何謂初始化?謝謝回答!
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

int ran;
ran=rand();
不是初始化,它是聲明與賦值語句。

int ran=rand(); 聲明 時就 給定數值,叫初始化。

if(ans=='n') goto done; 轉向語句不允許 跳過一個 同一層的 含 初始化 的區域。

轉向語句只允許轉向它的同層或外層。如果你把初始化部分用花括號括起來,讓它成為一個內層,就允許了:
if(ans=='n') goto done;
{ int ran=rand(); };
done: return 0;

查看完整回答
反對 回復 2019-03-26
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

這個基本上可以視為編譯器bug, intel編譯器也有這種問題,而微軟編譯器就沒有。

如果goto跳過的代碼含有初始化就會視為錯誤,即便這個變量在這種情形下根本不會被使用。這么做是毫無意義的...

int i = 0;這就是初始化,在聲明的時候用=賦予初始值。修改前后生成的代碼沒有區別。

查看完整回答
反對 回復 2019-03-26
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

你把那個goto語句去掉試一下,如果沒有問題的話
就應該是編譯器不知道程序應該怎么樣處理的這樣問題
因為前面有一個跳轉語句,編譯器不知道是否應該給后面的變量ran進行初始化

查看完整回答
反對 回復 2019-03-26
  • 3 回答
  • 0 關注
  • 955 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號