很多初学者在使用C语言写函数时,不清楚return返回值原理,在函数的一处return中返回多个值。注意!这个写法是完全错误的,一个return只能返回一个值 下面我讲用一些代码和实例解释 (环境:windows下的visual studio 2019)
#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之后是直接跳出函数了。
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.待会返回值,并且返回值有且只有一个