C++中,if语句中,赋值语句放在if语句块里面还是外面有什么不同?详细代码如下

#include<iostream>
using namespace std;
int main()
{
int*p=new int;
if(p!=NULL)
{
int&r=*p;
r=3;
}
cout<<"*p:"<<*p<<"\n";
return 0;
}
运行正常

然后我稍微改一下,把r=3;放在if语句块下一句,理论上运行结果应该是一样的啊,如下
#include<iostream>
using namespace std;
int main()
{
int*p=new int;
if(p!=NULL)
{
int&r=*p;
}
r=3;
cout<<"*p:"<<*p<<"\n";
return 0;
}
结果提示错误:
D:\C++实验\引用还是指针.cpp(10) : error C2065: 'r' : undeclared identifier
执行 cl.exe 时出错.
哪位大神解释一下这两种写法有啥不同?

if 用于判断,如果条件为真则执行分支语句,否则不执行。
{}表示一个局部范围。
你给出的题中,第一种情况 r=3 紧跟 int&r=*p;语句,自然都符合语法。

但是第二种情况,r 的定义int&r=*p在{}里,出了{}就无效了, r=3自然导致编译错误。
这是一个变量生命周期及作用域问题,希望对楼主有帮助。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-14
作用域的问题,你在if块里定义的变量的作用域就是那个块,出了那个块,那个变量就被释放了,不存在了。
所以你的赋值应该在块里。
如果要在块外赋值,你的变量定义就要在块外了
第2个回答  2013-03-14
if(p!=NULL)
{
int&r=*p;//开始定义了r
}//变量r被释放了
r=3;//r已经被释放,所以r不存在
这其实是一个作用域的问题。如果写出一个大于局部变量范围的变量就应该OK了本回答被提问者和网友采纳
第3个回答  2013-03-15
变量r是在if块中申明的,if语句快执行完后r的空间已经释放,不存在r了,下面有又给r赋值,所以报错r未被申明,可以把r声明在if语句快的上面。
第4个回答  2013-03-14
{
int&r=*p;
}
在{}中定义的变量意思就是r是局部变量,局限在{}内使用,不能在{}之外使用!
相似回答