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

如下程序:
#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();就对了?
书中解释为:一个需要初始化的变量,只要它在作用域内,就必须保证已经对其进行过初始化了。怎样理解这句话,修改前后的句子有什么不同?何谓初始化?
谢谢回答!

繁星点点滴滴
浏览 912回答 3
3回答

小怪兽爱吃肉

int ran;ran=rand();不是初始化,它是声明与赋值语句。int ran=rand(); 声明 时就 给定数值,叫初始化。if(ans=='n') goto done; 转向语句不允许 跳过一个 同一层的 含 初始化 的区域。转向语句只允许转向它的同层或外层。如果你把初始化部分用花括号括起来,让它成为一个内层,就允许了:if(ans=='n') goto done;{ int ran=rand(); };done: return 0;

萧十郎

这个基本上可以视为编译器bug, intel编译器也有这种问题,而微软编译器就没有。如果goto跳过的代码含有初始化就会视为错误,即便这个变量在这种情形下根本不会被使用。这么做是毫无意义的...int i = 0;这就是初始化,在声明的时候用=赋予初始值。修改前后生成的代码没有区别。

慕后森

你把那个goto语句去掉试一下,如果没有问题的话就应该是编译器不知道程序应该怎么样处理的这样问题因为前面有一个跳转语句,编译器不知道是否应该给后面的变量ran进行初始化
打开App,查看更多内容
随时随地看视频慕课网APP