简单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();就对了?
书中解释为:一个需要初始化的变量,只要它在作用域内,就必须保证已经对其进行过初始化了。怎样理解这句话,修改前后的句子有什么不同?何谓初始化?
谢谢回答! 展开
#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();就对了?
书中解释为:一个需要初始化的变量,只要它在作用域内,就必须保证已经对其进行过初始化了。怎样理解这句话,修改前后的句子有什么不同?何谓初始化?
谢谢回答! 展开
4个回答
展开全部
int ran;
ran=rand();
不是初始化,它是声明与赋值语句。
int ran=rand(); 声明 时就 给定数值,叫初始化。
if(ans=='n') goto done; 转向语句不允许 跳过一个 同一层的 含 初始化 的区域。
转向语句只允许转向它的同层或外层。如果你把初始化部分用花括号括起来,让它成为一个内层,就允许了:
if(ans=='n') goto done;
{ int ran=rand(); };
done: return 0;
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跳过的代码含有初始化就会视为错误,即便这个变量在这种情形下根本不会被使用。这么做是毫无意义的...
int i = 0;这就是初始化,在声明的时候用=赋予初始值。修改前后生成的代码没有区别。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
听楼上大家的意见,应该是程序执行的层次问题吧"int ran:ran=rand()"里的":"是包含的意思,整句意思是"intran"包含"ran=rand()".
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你把那个goto语句去掉试一下,如果没有问题的话
就应该是编译器不知道程序应该怎么样处理的这样问题
因为前面有一个跳转语句,编译器不知道是否应该给后面的变量ran进行初始化
就应该是编译器不知道程序应该怎么样处理的这样问题
因为前面有一个跳转语句,编译器不知道是否应该给后面的变量ran进行初始化
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询