常规a和b的交换 交换出不寻常

SearchLife 2008-12-13 11:04:11
#include <iostream>
#include <string>

using namespace std;

void swap(int& a,int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}

int main()
{
int a = 100;
int b = 200;

swap(a,b);

cout << a <<"----" << b << endl;

return 0;
}

将 int a = 100; int b = 200; 改成long a =100;long b =200;能不能实现a和b交换?
改成long a =100;int b =200;能不能实现a和b交换?
改成int a =100;long b =200;能不能实现a和b交换?
改成double a =100;double b =200;能不能实现a和b交换?

请仔细分析其中哪些产生了临时变量? 我用的是vc6

我现在发现c++可是越来越有趣了。^_^

...全文
166 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
speeder53 2008-12-15
  • 打赏
  • 举报
回复
mk
herman~~ 2008-12-14
  • 打赏
  • 举报
回复
mark
Dreamz 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Chiyer 的回复:]
将  int a = 100; int b = 200; 改成long a =100;long b =200;能不能实现a和b交换?
改成long a =100;int b =200;能不能实现a和b交换?
改成int a =100;long b =200;能不能实现a和b交换?
改成double a =100;double b =200;能不能实现a和b交换?

引用参数是严格要求类型匹配的,除了const引用外

所以你的例子中,如果不是int 类型作为参数将编译不过,就算编译通过了

实际调用的时候不是调用你定义的swap,而是std::…
[/Quote]
学习了^^
lc19890326 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 kiffa 的回复:]
to 13L: 不是编译器不允许,是标准不允许。。。

只有const引用可以指向不同类型的对象。。。本质上是指向一个转换后的无名临时对象。。。

C/C++ codedoubled=3.44;constint&i=d;
[/Quote]
同意
星羽 2008-12-13
  • 打赏
  • 举报
回复
将 int a = 100; int b = 200; 改成long a =100;long b =200;能不能实现a和b交换?
改成long a =100;int b =200;能不能实现a和b交换?
改成int a =100;long b =200;能不能实现a和b交换?
改成double a =100;double b =200;能不能实现a和b交换?

引用参数是严格要求类型匹配的,除了const引用外

所以你的例子中,如果不是int 类型作为参数将编译不过,就算编译通过了

实际调用的时候不是调用你定义的swap,而是std::swap
kiffa 2008-12-13
  • 打赏
  • 举报
回复
to 13L: 不是编译器不允许,是标准不允许。。。

只有const引用可以指向不同类型的对象。。。本质上是指向一个转换后的无名临时对象。。。

double d = 3.44;
const int &i = d;
SearchLife 2008-12-13
  • 打赏
  • 举报
回复
我看了一下你的程序,我想这应该不是课后题吧。
首先一个问题就是你调用的是std::swap,而不是你定义的swap。

std::swap这个模板可以自动适应各种不同的类型,但是两种类型得一至,否则会提示出错。

如果你想调用你自己的swap,你可以改个名字,如myswap。
这个函数传int以外的类型给他是根本用不了的。根本不存在什么long double的问题


-----------------
我试了一下,原来真是是这样子啊。谢谢啊。

星羽 2008-12-13
  • 打赏
  • 举报
回复
为什么不这样呢

template<typename T1, typename T2>
void swap(T1& a, T2& b)
{
T1 t = a;
a = b;
b = t;
}

lc19890326 2008-12-13
  • 打赏
  • 举报
回复
你调用的swap是标准库中的模板函数

template<class Type>
void swap(
Type& _Left,
Type& _Right
);


可见必须要两个值一致才能推导参数Type的类型,要是不一致就产生了二义性

如果是你自己写的swap,如改名为swap1,你可以试试,除了两个都为int才可以传递给int&,其他任何类型根本不可以使用
一般来说编译器(我试的VS2005和DEV C++都是不可以的)是不赞成进行一般类型的引用转换的(貌似标准是允许的),比如一个double值传给int&就是错误的
引用转换一般来说只有一种情况,就是基类对象传递给派生类引用,否则其他的时候别用为好
SearchLife 2008-12-13
  • 打赏
  • 举报
回复
我用VS2005测试
当a b类型相同的时候(无论是double long)都可以转换
但当类型不同的时候 会提示错误不能转换为int&

---------------
我测试也是这样子的.
他们是需要强制转换为int然后再与形参进行绑定吗?
还是在传参时将实参a和b的类型暂时解释为int了?

为什么下面的引用不成功。
long t = 100L;
s(t);
void s(int& c)
{
c++;
}
zy1691 2008-12-13
  • 打赏
  • 举报
回复
如果你是想实现一个任意类型做交换的函数,你可以试着把你的函数改成这样
template <class T1,class T2>
void myswap(T1& a,T2& b)
{
double temp;
temp = a;
a = b;
b = temp;
}
我试了一下,基本上可以用,但是建议你最好不要用这个,玩一下还可以,100 200的大概不会出问题。
但是如果是其他的精度,涉及到精度转换的问题可能变得非常复杂,有可能造成丢失数据。
这也是std::swap强制要求精度一致的原因。
jznhljg 2008-12-13
  • 打赏
  • 举报
回复
a ^= b ^= a ^= b;
nullah 2008-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
我用的是vc2005,既然微软开发了2005,vc6,就肯定存在相对不合理的地方。
深究这些编译器的实现方式或者实现的细节,没有什么意义,尤其是一个没有代码的编译器。
[/Quote]
up
zy1691 2008-12-13
  • 打赏
  • 举报
回复
我看了一下你的程序,我想这应该不是课后题吧。
首先一个问题就是你调用的是std::swap,而不是你定义的swap。

std::swap这个模板可以自动适应各种不同的类型,但是两种类型得一至,否则会提示出错。

如果你想调用你自己的swap,你可以改个名字,如myswap。
这个函数传int以外的类型给他是根本用不了的。根本不存在什么long double的问题
wuyu637 2008-12-13
  • 打赏
  • 举报
回复
语言标准也只是关键的部分定义了。总不能什么细节都定义好了吧,那就不叫标准了。就是一个实现文档了。
lc19890326 2008-12-13
  • 打赏
  • 举报
回复
我用VS2005测试
当a b类型相同的时候(无论是double long)都可以转换
但当类型不同的时候 会提示错误不能转换为int&

传引用相当于将形参和实参绑定起来 对形参的操作都等同于对实参操作 没有什么特别好分析的地方吧
SearchLife 2008-12-13
  • 打赏
  • 举报
回复
虚心向 wuyu637 请教:

在http://topic.csdn.net/u/20081213/18/b737c9fa-3c1d-4824-b7b1-119579104982.html
这个帖子中,能不能详细地说明一下啊?
lann64 2008-12-13
  • 打赏
  • 举报
回复
只改 a和b呀?
那int temp; 呢?
zhangxichao 2008-12-13
  • 打赏
  • 举报
回复
不知有什么深的含义,vc6能交换下又怎样,换了其它编译器和平台结果就未必了一致了。

#include <iostream>
#include <string>

using namespace std;
typedef double swap_type;//想比较什么这里修改

void
swap (swap_type & a, swap_type & b)
{
swap_type temp;
temp = a;
a = b;
b = temp;
}

int
main ()
{
swap_type a = 100;
swap_type b = 200;

swap (a, b);

cout << a << "----" << b << endl;

return 0;
}
SearchLife 2008-12-13
  • 打赏
  • 举报
回复
我用的是vc2005,既然微软开发了2005,vc6,就肯定存在相对不合理的地方。
深究这些编译器的实现方式或者实现的细节,没有什么意义,尤其是一个没有代码的编译器。
-----------------

说的有道理啊。那c++标准中就没有提及这些问题吗?
加载更多回复(1)

65,211

社区成员

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

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