转自https://blog.csdn.net/nightfall_/article/details/52250358?locationNum=3&fps=1
return
return语句用来终止当前正在执行的函数并将控制权返回到调用该函数的地方。return有两种形式:
(1) return;
无返回值函数
没有返回值的return语句只能用在返回类型为void的函数中。void类型的函数不要求非得有return语句,在这类函数最后一句会隐式的执行return。
void swap(int &x,int &y)
{
if( x == y)
return;//如果两个数相等,则直接返回。这里就有点类似break语句了
int tmp = x;
x = y;
y = tmp;
//这里会隐式调用return,无须显式调用
}
(2)return XXX;
有返回值的函数
只要函数的返回类型不是void,则该函数每条return语句必须返回一个值,这样可以实现传数据。并且,return返回值的类型必须和函数返回值类型相同,或者能隐式转换成函数返回类型。
ListNode* BuyNode(DataType x)
{
ListNode* tmp= (ListNode*)malloc(sizeof(ListNode));
assert(tmp);
tmp->_data = x;
tmp->_next = NULL;
return tmp; //返回值类型和函数返回值类型一致
}
值是如何被返回的
返回一个值的方式和初始化一个变量方式是一样的。
1. 返回局部变量
就上述 ListNode* BuyNode(DataType x) 来说该函数返回值为ListNode*类型的tmp局部变量,当调用这个函数时,该函数将返回tmp的副本(即返回值tmp的拷贝值)。
2. 函数返回引用
返回引用即返回对象的别名,那么此时就不会去拷贝
void
void真正发挥作用在于
(1). 对函数参数的限定
如果函数无参数,那么应该声明其参数为void
int function(void)
{
return 1;
}
这样的话当你给它传递一个参数时就会报错,表明这个函数不接受任何参数。
如果函数参数可以是任意类型指针,那么应该声明为void*原因如下:
先看这个例子:
float *p1;
int *p2;
p1 = p2;
编译器会报错,提示类型不能转换,那么为了编译通过我们加上强制类型转换 p1 = (float*)p2,这样就可以编译成功了。
这时候void*就不同了,它可以接受其他类型的东西
void *p1;
int *p2;
p1 =p2;
但这并不意味着p2 = p1也可以,这样不行。也就是空类型它哟有一定的包容性。而有类型则没有包容性。
(2).对函数返回值的限定
跟上面一样函数返回值也可以是void*,典型函数如下:
void* memcpy(void* desc, const void* src,size_t len)
这样任何类型的指针都可以传入memcpy中,这也真正体现了内存操作函数的意义,因为他操纵的对象是一块内存区,而无论这片内存区是什么类型的。而且,这个函数返回值也是void* ,很有趣。