转自:https://blog.csdn.net/nightfall_/article/details/52250358
关键字return
return语句用来终止当前正在执行的函数并将控制权返回到调用该函数的地方。return有两种形式:
1).return;
- 无返回值函数
没有返回值的return语句只能用在返回类型为void的函数中。void类型的函数不要求非得有return语句,在这类函数最后一句会隐式的执行return(最常见的是main函数,这个下面说)
直接上列子说明
void swap(int &x,int &y)
{
if( x == y)
return;//如果两个数相等,则直接返回。这里就有点类似break语句了
int tmp = x;
x = y;
y = tmp;
//这里会隐式调用return,无须显式调用
}
2).return expression;
- 有返回值的函数
只要函数的返回类型不是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.函数返回引用
返回引用即返回对象的别名,那么此时就不会去拷贝
主函数main的返回值
如果函数的返回类型不是void,那么它必须返回一个值。但是main函数是个例外,我们允许main函数没有return语句就直接结束。当控制语句到达main函数结尾处而且没有return,编译器将隐式插入return 0;的语句。但是我们还是应该保持一个良好习惯,做程序就应该严谨,不是吗。
关键字void
void这个关键字有什么好说的呢,确实有。你可能只知道它代表一个空类型,那么不知道你有没有试过像int i; 一样定义一个void i;呢?当然是编译出错,没有疑问。
1.)可是为何呢?
- void不能代表一个真实变量
当我们定义变量时必须分配内存空间,定义void类型变量到底给它分配多大内存呢。由于这个原因,无论是定义void a变量还是作为函数参数(function(void a ))这样都会出现错误。
2.)它有什么用呢?
- 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* ,很有趣。