赞
踩
从简单的hello world 程序说起
#include <stdio.h>
int main( )
{
printf( "Hello World!" );
return 0;
}
这是所有学C语言的人写的第一个程序,初学时就注意到这里有个**return 0;**而经过实验,仿佛不加 return 0; 也能运行,那么它存在的必要性是什么呢?我们要搞明白这个东西要搞清楚一个概念——函数。
C语言将函数称为Function,其中文意思不仅有函数的意思,还有个意思是功能。关于C语言函数的说法有很多,但对于初学者是晦涩难懂的,我们在此借用高中对函数的理解,和大家分享一下如何理解函数。
相信大家对这个式子非常熟悉,我们再看看C语言里面函数的样子
int Function(int a)
{
int b=-a;
return b;
}
我们对比一下:
C语言 | 中学学的函数 |
---|---|
Function | f |
a | x |
b | y |
可以看到C语言里面的参数框中的变量 int a,即为普通函数的自变量x,Function不过是普通函数的函数名,return后面跟着的b不就是求得的函数值吗?由此我们可以得到一个有用的信息,return返回的是你这个函数得到的最终结果。
而我们常常看到如下这种情况:
int sum(int a,int b)
{
return a+b;
}
参数框里面不止一个参数,此时我们将引入多元函数来解释此现象:
而从中此例子可以看出return 后面不仅可以跟变量还可以跟表达式,扩展一下return 后面可以跟常量,常用的比如1,0,-1,也可以是宏定义的常量。
同时我们也知道,并不是所有函数都需要return,那么不用return的这些函数的函数类型又是什么呢?我们知道函数的类型取决于返回值的类型,这些没有返回值的函数就没有类型,但是没有类型我们也取个类型名字叫做无类型(void)。
函数的类型有多重要,我们下面运行一个较复杂的代码,通过实例来看看。
附上此题的一段代码:
#include<stdio.h> #include<math.h> #define pai 3.1415926 int chord(float h) //求半弦长的函数 { float a; a= sqrt(2*h - h * h); return a; } float area(float h,float k) //求面积函数 { float t1,t2; for(int t=1;t<6;t++) { for(int i=0;i<10;i++) { t1=acos(1-h)-(sqrt(2*h-h*h))*fabs(1-h); t2=k*pai/(1+k); if(t1<t2) h=h+pow(0.1,t); if(t1==t2) h=h; if(t1>t2) h=h-pow(0.1,t); } } return h; } int main() { float h = 1,k, a; float c,n; printf("请输入比值:"); scanf("%f:%f", &c,&n); k=c/n; if (k <= 1) k = k; else k = 1 / k; h=area(h,k); a =chord(h); //调用函数chord() printf("切口弦长为%.4f", 2 * a); }
运行截图:
我们发现调取chord()函数的时候,在1:2的比值情况下出现了错误。首先,我们声明此函数算法没有问题。那么返回0.0000又是为什么呢?
我们注意到return 后面跟着的a为float类型,而该函数为int类型。我们知道最后的答案应该为1.9285,这是float类型他并不能以int 的形式传送过去,而对于2.0000,实践证明它相当于2的形式能正确传出。
意味着函数类型和return 的变量类型不同时,返回的结果正确与否还得看天意???
解决办法就很明显了,你类型不同产生的问题,我直接改成一样的嘛。
修改后的代码和运行结果截图如下:
#include<stdio.h> #include<math.h> #define pai 3.1415926 float chord(float h) //求半弦长的函数 { float a; a= sqrt(2*h - h * h); return a; } float area(float h,float k) //求面积函数 { float t1,t2; for(int t=1;t<6;t++) { for(int i=0;i<10;i++) { t1=acos(1-h)-(sqrt(2*h-h*h))*fabs(1-h); t2=k*pai/(1+k); if(t1<t2) h=h+pow(0.1,t); if(t1==t2) h=h; if(t1>t2) h=h-pow(0.1,t); } } return h; } int main() { float h = 1,k, a; float c,n; printf("请输入比值:"); scanf("%f:%f", &c,&n); k=c/n; if (k <= 1) k = k; else k = 1 / k; h=area(h,k); a =chord(h); //调用函数chord() printf("切口弦长为%.4f", 2 * a); }
运行截图
此时是完全没有问题的。
那么来到下一个问题,返回值为数组的时候怎么办?
通过有返回值的C语言的函数数学模型对应着单值多元函数即可得知,返回值只能有一个啊,亲。
数组里面一堆东西,而C语言属于面向过程编程,不能像python等编程语言把类似于C语言数组的一个叫列表的东西以对象的形式返回。
这个时候就在C语言的精华了,这个东西叫指针。具体学习内容很多,可以参考别的博文。先说结论,数组里面一堆数,他得放到电脑内存里面啊,放到内存里面就在那个内存格里面放的不就有个地址吗?指针就是记录这个地址的一个变量,而且神奇的是数组里面的数都连排住,比如第一个住100,第二个住101这种的。
这时候思路就明朗了,我们只要知道了第一个数的地址,根据这些数连排住,不就可以知道所有的地址了吗?知道地址我们就可以通过解引用操作(*跟上指针变量名)得到该地址下的变量的值。
所以了我们只需要返回数组第一个数的地址便可以知道整个数组的内容了。
而此时的问题,如何返回首地址呢?
还好C语言干了件人事,数组名就是个指针,而且还恰巧指在了我们所谓的第一个数的地址,即首地址。结合上面所说,返回变量类型要和函数类型有所对应。数组名为指针,则函数为指针类型。是什么指针类型取决于数组是什么类型的数组。
#include <stdio.h>
int main( )
{
printf( "Hello World!" );
return 0;
}
下面回到最初的问题,hello world中为什么会有个return 0,因为main函数也是函数,观察下这段代码:main的类型,int类型。我们所知没有返回值的函数是不是应该为void类型,也就是说你写void main()或者 main()不写return0在逻辑上是一点问题也没有,但是他为int 类型你是不是得给他个返回值?那么为什么要return 0 呢?
main函数的返回值为0表示执行完整个main函数没有问题,成功返回。
要知道main()和其他函数可不同,最终所有的调用不都是在这里完成的吗?
那为什么0代表正常退出呢?
下面需要了解一个函数exit(),字面意思一个表示退出的函数,然后重点来了exit()的传入参数分为0和非0两种状态。exit(0)表示程序正常退出,exit(1)(1可以为其他的非零数字)为非正常退出。
写作不易,如果对你有帮助的话,请留下你的评论和赞吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。