C语言中函数return单一返回值

C语言中函数的return作用及其原理

很多初学者在使用C语言写函数时,不清楚return返回值原理,在函数的一处return中返回多个值。注意!这个写法是完全错误的,一个return只能返回一个值
下面我讲用一些代码和实例解释
(环境:windows下的visual studio 2019)

return的作用

1.结束函数

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	printf("hello world!");
	return 0;
}

这是一个在简单不过的函数了,但是很多人在刚入手C语言的时候只顾着抄写着书上的代码,忽视了在这最基本的函数语法中return的作用,就是结束函数。
这个功能有点类似于循环中的break,只不过return更强大一些,直接跳出整个函数。

注:可以有多处return,但是只能从一处跳出。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int ret()
{
	return 1;
	return 2;
}

int main()
{
	int rec = ret();
	printf("%d",rec);
	return 0;
}

函数的编译是从前往后进行编译的,所以应该是先读到**“return1”**,然后直接结束这个函数,并不会执行return2。

其运行结果如下图所示
在这里插入图片描述
注:有些人习惯用void main(){ }的方式来编写主函数,这里非常不推荐这种写法,这是一种老旧的写法。


当然void函数中也可以加入return语句,但是这里的return就不会返回值而是直接结束函数。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void ret()
{
	printf("return 1\n");
	return;
	printf("return 2\n");
}
int main()
{
	ret();
	printf("hello world");
	return 0;
}

运行结果如下图所示:
在这里插入图片描述可以看到只执行了第一个语句,return之后是直接跳出函数了。

2.返回一个值

return还有一个作用就是返回一个值,当然这个值可以为空。
例如讲第一个函数的return的0删去,代码依旧可以运行。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	printf("hello world");
	return ;
}

运行结果如下图所示:
在这里插入图片描述


重点来了!!!
c语言中的return只能返回单一的值
许多朋友在一开始用return的时候尝试过用return返回两个值(下面我用一个 交换两个数的数值函数(swap)为例)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int swap(int x ,int y )
{
	int temp = 0;
	temp = x;
	x = y;
	y = temp;
	
	return x, y;
}

int main()
{
	int a = 1;
	int b = 2;
	printf("%d %d",swap(a,b));
	return 0;
}

这个代码是可以编译的,没有error提示,但是会弹出警告⚠说printf没有接受足够的参数。
我们来看一下运行结果:
在这里插入图片描述可以看到第一个 %d 接受的是第一个return值 1,第二个 %d 就出现错误了。这说明了return只会返回最后面那个值,即为swap函数return的 y


原理解释

在c语言中,程序的函数的调用是创建一个函数栈帧,并在返回数值之后将其销毁。程序的一开始要开辟一块空间(栈),以便后续开辟函数栈帧。
在这里插入图片描述可以看到return的返回值是建立在新开辟的函数栈帧中esp寄存器临时存储的值,在函数调用完之后把最终return的值放到esp中返回原申请调用的函数中,ebp是在调用函数的栈顶位置,存储esp应返回的地址,随着esp的返回,esp寄存器中的值也随着返回。所以return的值只有esp寄存器带来的返回值一个。

总结

c语言中return语句的功能只有两个
1.结束函数
2.待会返回值,并且返回值有且只有一个

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值