如下程序:#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;
萧十郎
TA贡献1815条经验 获得超12个赞
这个基本上可以视为编译器bug, intel编译器也有这种问题,而微软编译器就没有。
如果goto跳过的代码含有初始化就会视为错误,即便这个变量在这种情形下根本不会被使用。这么做是毫无意义的...
int i = 0;这就是初始化,在声明的时候用=赋予初始值。修改前后生成的代码没有区别。
- 3 回答
- 0 关注
- 897 浏览
添加回答
举报
0/150
提交
取消