为了账号安全,请及时绑定邮箱和手机立即绑定

简单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条经验 获得超12个赞

这个基本上可以视为编译器bug, intel编译器也有这种问题,而微软编译器就没有。

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

int i = 0;这就是初始化,在声明的时候用=赋予初始值。修改前后生成的代码没有区别。

查看完整回答
反对 回复 2019-03-26
?
慕后森

TA贡献1802条经验 获得超5个赞

你把那个goto语句去掉试一下,如果没有问题的话
就应该是编译器不知道程序应该怎么样处理的这样问题
因为前面有一个跳转语句,编译器不知道是否应该给后面的变量ran进行初始化

查看完整回答
反对 回复 2019-03-26
  • 3 回答
  • 0 关注
  • 834 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信