简单C++问题,关于goto语句的错误用法

如下程序:#include<iostream>#include<cstdlib>usingnamespacestd;intmain(){cout<<"Computeara... 如下程序:
#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();就对了?
书中解释为:一个需要初始化的变量,只要它在作用域内,就必须保证已经对其进行过初始化了。怎样理解这句话,修改前后的句子有什么不同?何谓初始化?
谢谢回答!
展开
 我来答
L_o_o_n_i_e
2009-02-05 · TA获得超过4.2万个赞
知道大有可为答主
回答量:8507
采纳率:38%
帮助的人:5249万
展开全部
int ran;
ran=rand();
不是初始化,它是声明与赋值语句。

int ran=rand(); 声明 时就 给定数值,叫初始化。

if(ans=='n') goto done; 转向语句不允许 跳过一个 同一层的 含 初始化 的区域。

转向语句只允许转向它的同层或外层。如果你把初始化部分用花括号括起来,让它成为一个内层,就允许了:
if(ans=='n') goto done;
{ int ran=rand(); };
done: return 0;
BlueWanderer
2009-02-05 · TA获得超过9209个赞
知道大有可为答主
回答量:5673
采纳率:83%
帮助的人:2021万
展开全部
这个基本上可以视为编译器bug, intel编译器也有这种问题,而微软编译器就没有。

如果goto跳过的代码含有初始化就会视为错误,即便这个变量在这种情形下根本不会被使用。这么做是毫无意义的...

int i = 0;这就是初始化,在声明的时候用=赋予初始值。修改前后生成的代码没有区别。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hbsidear
2009-02-06
知道答主
回答量:55
采纳率:0%
帮助的人:15.6万
展开全部
听楼上大家的意见,应该是程序执行的层次问题吧"int ran:ran=rand()"里的":"是包含的意思,整句意思是"intran"包含"ran=rand()".
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cheng1987628
2009-02-06
知道答主
回答量:9
采纳率:0%
帮助的人:0
展开全部
你把那个goto语句去掉试一下,如果没有问题的话
就应该是编译器不知道程序应该怎么样处理的这样问题
因为前面有一个跳转语句,编译器不知道是否应该给后面的变量ran进行初始化
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式