函数的传参和返回、以及a,b值交换的三种模式(一种是错误的交换实例)——初学C语言的浪荡第一学期

下一个疑惑
函数里面的知识点,传参,返回值

Question 1
有以下程序
fun(int x, int y)
{ static int m=0, i=2;
i+=m+1; m=i+x+y; return m;
}
main()
{ int j=1, m=1, k;
k=fun(j,m); printf("%d,",k);
k=fun(j,m); printf("%d\n",k);
}
执行后的输出结果是 ( B )
A) 5, 5
B) 5, 11
C) 11, 11
D) 11, 5

第一轮输出,由题得f(j,m)就是fun(x,y),即x=1,y=1。而k就等于fun下面函数中的m。所以i+=m+1就是i=i+m+1=2+0+1=3,k=m=i+x+y=3+1+1=5。第二轮输出,i=i+m+1=3+5+1=9,k=m=i+x+y=9+1+1=11。

Thinking 1
首先是这一个题,按照正常思路计算就可以了
然后我又遇到了这一个题

Question 2
以下程序的输出结果是 ( C )
fun(int x, int y, int z)
{ z=x * x+y * y; }
main()
{
int a=31;
fun(5,2,a);
printf("%d",a);
}
A) 0
B) 2
C) 31
D) 无定值

Thinking 2
我一算,??难道不是29???fun前面没写变量名那就是int,这个知识点还是晓得,是不是还有什么知识点没记住呢?

Solution
定义的函数 fun没有返回值,而且参数不是引用型的,所以形参的改变不会影响实参,即 a 的值,输出的是31。要区分第1题,有return,这个题就没有return 。

原来如此,还得有个return才可以。接着我又去查了“引用型”(因为想到了不久之前写的swap交换a和b的值的方式)

Extra Harvest

#include <stdio.h>
#include <stdlib.h>
void swap_1(int x,int y)
{
	int t=0;
	t=x;
	x=y;
	y=t;
}

int main()
{
	int a=3;
	int b=5;
	swap_1(a,b);
	printf("%d\n%d",a,b);
	return 0;
}

运行结果:
3
5

也就是说形参交换了位置,但实参a,b并无任何变化,这个时候,我们就要用到“引用型”

#include <stdio.h>
#include <stdlib.h>
void swap_2(int & x,int & y)
{
	int t=0;
	t=x;
	x=y;
	y=t;
}

int main()
{
	int a=3;
	int b=5;
	swap_2(a,b);
	printf("%d\n%d",a,b);
	return 0;
}

运行结果出现:error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
搜索资料:C语言里面没有所谓的“按引用传递”,C++才可以
解决方案:

  1. 还是用指针,在主函数中传址(现阶段只会这个…)
  2. 将代码扩展名保存成.cpp文件

最终

#include <stdio.h>
#include <stdlib.h>
void swap_3(int * x,int * y)
{
	int t=0;
	t=*x;
	*x=*y;
	*y=t;
}

int main()
{
	int a=3;
	int b=5;
	swap_3(&a,&b);
	printf("%d\n%d",a,b);
	return 0;
}

运行结果:
5
3

成功~~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值