关于引用的问题

Gzd2003 2008-11-07 04:05:08
(1)
为什么以下的程序编译出错呢?编译错误信息如下:
error C2440: 'return' : cannot convert from 'int' to 'int &'

#include <iostream.h>
int& f(int x)
{
return x+1;
}
void main()
{
int x=2;
f(x)=3;
cout<<x<<endl;
}

(2)
修改程序如下:
#include <iostream.h>
int& f(int x)
{
return x;
}
void main()
{
int x=2;
f(x)=3;
cout<<x<<endl;
}
编译存在警告,信息如下:
warning C4172: returning address of local variable or temporary
不理会警告信息,执行程序,输出2,而不是预期的3,为什么?

(3)
再次修改程序如下
#include <iostream.h>
int& f(int x[])
{
return x[0];
}
void main()
{
int x[]={2};
cout<<f(x)<<endl;
f(x)=3;
cout<<x[0]<<endl;
}
运行结果如下:
2
3
这个程序达到了预期效果,为什么使用数组就可以呢?
...全文
124 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gzd2003 2008-11-08
  • 打赏
  • 举报
回复
int& f(int x)
返回的是一个int型引用,它是个右值,不能出现:f(x)=3;

引用不是可以表示左边吗?不明白以上意思。
insulted 2008-11-08
  • 打赏
  • 举报
回复
关于(3),我只想说一句话:“引用和指针的语义是相似的,引用是不可改变的指针,指针是可以改变的引用都是实现了引用语义。”
JIGSONG 2008-11-08
  • 打赏
  • 举报
回复
int& f(int x)
返回的是一个int型引用,它是个右值,不能出现:f(x)=3;
更不用说“convert from 'int' to 'int &' ”
[Quote=引用楼主 Gzd2003 的帖子:]
(1)
为什么以下的程序编译出错呢?编译错误信息如下:
error C2440: 'return' : cannot convert from 'int' to 'int &'

#include <iostream.h>
int& f(int x)
{
return x+1;
}
void main()
{
int x=2;
f(x)=3;
cout < <x < <endl;
}

(2)
修改程序如下:
#include <iostream.h>
int& f(int x)
{
return x;
}
void main()
{
int x=2;
f(x)=3;
cout < <x < <endl;
}

[/Quote]
Gzd2003 2008-11-07
  • 打赏
  • 举报
回复
问题1:
类型不匹配,肯定会出错,可以改为
int& f(int x)
{
x += 1;
return &x;
}


实际编译出现错误信息如下:
--------------------Configuration: Test - Win32 Debug--------------------
Compiling...
Test.cpp
D:\Test.cpp(6) : error C2440: 'return' : cannot convert from 'int *' to 'int &'
A reference that is not to 'const' cannot be bound to a non-lvalue
Error executing cl.exe.

Test.exe - 1 error(s), 0 warning(s)
好像这种改法不行。

我现在想保持int& f(int x) 函数头不变,实现f(x)=3; 语句将x的值在3的基础上加1该如何修改f函数呢?谢谢。
#include <iostream.h>
int& f(int x)
{
//这个地方该如何写才能实现我要的功能呢?
}
void main()
{
int x=2;
f(x)=3;
cout < <x < <endl;
}
cyj626 2008-11-07
  • 打赏
  • 举报
回复
f(x)=3;

这个怎么解释啊??
高手解释下
cyj626 2008-11-07
  • 打赏
  • 举报
回复
up
jia_xiaoxin 2008-11-07
  • 打赏
  • 举报
回复
(1)
为什么以下的程序编译出错呢?编译错误信息如下:
返回类型不匹配,函数需要的返回类型为引用,而返回值为(X+1)非引用


(2)
f(x)=3; 只是给f(x)返回的局部变量赋值,并不是给x赋值

(3)
因为数组首地址可以看作指针,写成这样就不难理解了
int& f(int * x)
{
return x[0];
}

因为返回的是引用,所以返回值就是x指针指向的值,所以修改指针指向的值,就相当于修改数组的第一个元素
shailen126 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 Gzd2003 的帖子:]
(1)
为什么以下的程序编译出错呢?编译错误信息如下:
error C2440: 'return' : cannot convert from 'int' to 'int &'

#include <iostream.h>
int& f(int x)
{
return x+1;
}
void main()
{
int x=2;
f(x)=3;
cout < <x < <endl;
}

(2)
修改程序如下:
#include <iostream.h>
int& f(int x)
{
return x;
}
void main()
{
int x=2;
f(x)=3;
cout < <x < <endl;
}

[/Quote]

问题1:
类型不匹配,肯定会出错,可以改为
int& f(int x)
{
x += 1
return &x;
}
问题2:
#include <iostream.h>
int& f(int x)
{
return x; //x为局部变量,f函数执行完x被释放,即不存在了,函数不会返回任何值
}
void main()
{
int x=2;
f(x)=3;
cout < <x < <endl;
}
问题3:f函数返回的是数组的地址,其地址值在函数执行完不会被修改或释放。这也是C指针的一个重要特点,可以做函数返回值。其他编程语言是做不到的
feng4206yu 2008-11-07
  • 打赏
  • 举报
回复

#include <iostream.h>
int& f(int x)
{
return x+1;
}
void main()
{
int x=2;
f(x)=3;
cout < <x < <endl;
}

f()里面的变量是局部变量,在函数结束后就会被自动销毁,你返回这样一个变量的引用(引用既是引用变量本身),所以当然会出错...

#include <iostream.h>
int& f(int x[])
{
return x[0];
}
void main()
{
int x[]={2};
cout < <f(x) < <endl;
f(x)=3;
cout < <x[0] < <endl;
}

传递数组参数的时候其实传递的是数组指针,你所指向和引用的数组的作用域,实际是main中建立的,所以你可以安全返回.
zgy1353246 2008-11-07
  • 打赏
  • 举报
回复
int& f(int x)
{
return x+1;
}
///函数返回引用时,不能返回局部变量包括形参,因为,在函数调用结束时,你的局部变量生命期已经结束,返回的引用也就无效,编译就会出错
xhs_lh04 2008-11-07
  • 打赏
  • 举报
回复
数组名就是指针,就是数组地址,在返回的是引用也就是传入参数的栈内偏移,这样就一致了
xhs_lh04 2008-11-07
  • 打赏
  • 举报
回复
int &f(int &x)
{
x++;
return x;
}
xhs_lh04 2008-11-07
  • 打赏
  • 举报
回复

int f(int &x)
{
x++;
return x;
}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧