注册 登录
编程论坛 C++教室

请教一个关于c++函数值传递的问题

buyanyu4689 发布于 2011-06-22 18:35, 545 次点击
#include<iostream>
using namespace std;
void swap(int a , int b)
{
    int t=a;
    a=b;
    b=t;

}
int main()
{

int x=5,y=10;
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
return 0;
}
运行程序 结果 是
x=5y=10
x=5y=10
说明函数调用时传递的是实参的值  单向传递
但  我要是先写主函数  然后再定义swap函数结果就是
x=5y=10
y=10x=5
如果我在主函数中声明一下函数
结果就又回去了
请问谁知道这是怎么一回事啊
7 回复
#2
tisyang2011-06-22 22:23
说明函数调用时传递的是实参的值  单向传递

函数调用是复制传值的
但  我要是先写主函数  然后再定义swap函数结果就是
x=5y=10
y=10x=5

不知道你是怎么写的,可以实现这样的功能
如果我在主函数中声明一下函数

函数声明需要放到全局作用域中,不能放到某个函数的作用域中
#3
Toomj2011-06-22 22:28
“我要是先写主函数  然后再定义swap函数结果就是
x=5y=10
y=10x=5

我也想知道为啥?和楼主同等········
#4
lianjiecuowu2011-06-22 23:07
调用函数时首先调用自己声明的函数,没有找到才使用默认的函数,第二个里面swap没有在调用之前声明,当然使用系统默认的swap函数了
系统有一个自带的swap函数,不信你把第二个的swap函数注释掉,依然可以运行,而且是正确的交换结果

#include<iostream>
using namespace std;
//void swap(int a,int b);
int main()
{
int x=5,y=10;
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
system("pause");
return 0;
}
void swap(int a , int b)
{
    int t=a;
    a=b;
    b=t;

}
你试试啊
#5
我是菜鸟C2011-06-22 23:17
   这个问题其实就是地址的问题。。。
   lz,其实之前我也有同样的疑惑,但是结果弄懂之后就会觉得非常简单。简单点和你说吧,就是说你这个代码其实只是改变了a,b的值,a,b的值其实是得到了互换,但是x,y的值却没有变。、
   你若要实现x,y的互换的话,只需将swap函数中的a,b改为地址或者引用。即swap(&a,&b).
 
#6
kelas2011-06-23 09:18
以下是引用lianjiecuowu在2011-6-22 23:07:44的发言:

调用函数时首先调用自己声明的函数,没有找到才使用默认的函数,第二个里面swap没有在调用之前声明,当然使用系统默认的swap函数了
系统有一个自带的swap函数,不信你把第二个的swap函数注释掉,依然可以运行,而且是正确的交换结果
 
#include
using namespace std;
//void swap(int a,int b);
int main()
{  
int x=5,y=10;
cout<<"x="<
4L正解
#7
城东古桥2011-06-26 16:43
顶4楼====
#8
pangding2011-06-26 18:42
所以很多书都建议不要用
using namespase std;
这种语句。
而是用
using std::cin;
这样的。

优点是这种情况必须用
std::swap
才会调用标准库中的函数。

而实际上,正式的场合,一般都禁止使用 using naspase。
平时练习可以用用,但出了问题要能联想到原因。即使没有听说过标准库里的 swap,也应该能想到:没有在之前声明过的函数怎么会被用呢?
1