C语言学习3——基本的C语言语法知识
- 主函数
- 什么是主函数?
- 写一个自己的函数
- 主函数是整个C语言程序的入口
- 要调用函数,必须先知道函数
- 什么是变量?
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
相信你已经看到了第一个示例代码的效果了。这个程序所实现的效果很简单,就是在屏幕上输出了一行
字符"Hello World"。
我们根据这一小段代码,借此了解一些C语言的基础语法知识。
主函数
首先,主函数 main ,一个标准的主函数如下:
int main() // 这是主函数
{
return 0; // 主函数返回值
}
main 翻译成中文是主要的、最重要的意思,而在C语言里面表示一个主函数。
双斜杠后面的为 注释 ,打一个比较形象的比喻, 注释 就类似于老师在作业本上的批注。
一般来说,注释用于标注这段代码的用途或解释思路等。因为注释不会被当作代码进行编译,所以无论
添加什么注释内容,都不会对代码的实际运行产生任何影响。
如上代码中,用注释标出了哪里为 主函数 ,哪里是函数的 返回值 。
什么是主函数?
我们先谈谈什么是 函数 ?在大家的认知里面,函数是数学领域的一个名词,它可能是如下图所示:
但是,这只是数学领域中的 函数 ,与编程语言中的 函数 完全不同。
在编程语言里面,你可以把函数看做一个盒子,这个盒子有如下几个特性:
1. 开始执行时,函数可以被输入一些值
2. 执行过程中,函数可以做一些事情
3. 执行完成后,函数可以返回一些值
4.
让我们看看我们的这个主函数,在这3个特性上,分别做了什么。
1. 主函数什么都没有输入
5. 主函数打印了一行字到屏幕上
6. 主函数返回了0
其中, int 表明了函数的 返回值类型 为整数类型, int 是 integer(整数) 的缩写。这是由语言标准规定
的,不可以写成别的单词。
main 是 函数名 , main 后面的括号 () 内为输入参数,目前为空。
return 后跟函数的 返回值 ,为0。而0是一个整数,和函数名前面的 int 对应。
我们总结一下函数的写法公式:
函数返回值类型 函数名(函数输入参数值)
{
做点什么事情
return 函数返回值;
}
被花括号包括的被称为 函数体 ,注意函数体一定要被花括号包括且不可省略。花括号上面的函数名、函
数参数及返回值被称作 函数头 。
写一个自己的函数
我们不如趁热打铁,根据上面的函数写法的公式,写一个两个整数加法的函数。这个函数需要做到:输
入两个整数,返回它们相加的结果。
这个既然这个函数是用于计算加法的,我们把函数名取名为 add 。当然自定义函数的函数名可以按照自
己的喜好来写,就算写成aaaaa也行。不过,为了函数名拥有语义化,方便人阅读理解,我们一般使用
英文来作为函数名。
// 这一段代码被称之为add函数的函数定义
int add(int a, int b)
{
return a + b;
}
好的,那我们写完了一个 add函数 了。这一段代码被称之为add函数的函数定义。
主函数是整个C语言程序的入口
上面我们已经自己定义好了一个 add函数 ,那我们需要怎样来使用它呢? add函数 能直接运行嘛?
答案是不行的。
所有的C语言代码都有一个起始入口,而这个入口就是 主函数main 。进入了主函数以后,才能经由主函
数来调用其他函数。
这也意味着,每个C语言代码,只能有且只有一个main函数。
我们把代码稍微修改,现在代码如下。
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main()
{
int result;
result = add(2, 3);
printf("%d", result);
return 0;
}
当程序运行时,首先会进入 主函数main 。接着调用我们刚刚编写的 add函数 了。我们传了2个值分别是整数2和3给 add函数 。
函数的定义中规定了需要传a、b,2个参数,我们调用的时候,也必须传2个,并且类型也需要尽量一
致,否则编译可能会报错。(若类型不同,编译器会尝试自动类型转换。自动类型转换失败则会编译失
败。)
那么自然地,我们会想到,主函数是被谁调用的?主函数的返回值必须是 int 吗?
主函数在程序开始的时候被自动调用,不需要在程序内主动调用主函数。
而主函数的返回值会返回给调用这个程序的程序。
C语言标准中规定主函数有返回值且必须是 int 。如果程序正常结束,一般将返回值设置为0。
要调用函数,必须先知道函数
我们再来看看,编译器是怎么理解 add 这个名称的。
编译器会从代码开始,按照从上往下的顺序阅读代码。
编译器首先看到了一个函数的定义,描述了一个叫 add 的函数。接着,在 main 中需要使用 add ,由于
编译器已经知道了 add 的定义,因此编译器可以正常编译通过。
但是,如果将函数定义和函数调用反过来呢?
首先,编译器看到了 add 这个名称,编译器会很疑惑, add 是什么呢?编译器无法理解 add 究竟是什
么。因此,编译器将报错,并停止编译。
什么是变量?
在 add函数 计算完毕之后,需要有一个东西来接受 add 返回回来的值。所以,我们在 add 前面声明了一
个 int整型 的 变量 。
什么是变量呢?你可以把它看做一个空箱子,里面可以装任何其他的和它类型一致的值。
result 只是我们给它起的一个名字,当然,你可以任意起名。比如叫he,叫xiangzi,都可以。
我们把 add 返回回来的5,装进了 result 。因此, result 里面装着的值是5了。
= 等号,在C语言中是赋值运算符,相信你已经发现它有把右边的值装进左边变量的功能了。和函数一样,这里的等号和数学里面的等号,也是有很大不同的,它并不是相等的意思。
赋值运算符:将符号右边的值,装进左边的变量的一种运算符。
下图就是 add函数 接受2,3为输入,返回5,被赋值号 = 赋值给 result 的流程了。
那我们能不能这样写呢?去掉 int result; 这一条。
int main()
{
result = add(2, 3);
printf("%d", result);
return 0;
}
答案是不行的,变量必须先声明后使用。
编译器看到 result 这个名称,但是从未见过 result 的定义时,肯定也会疑惑它究竟是个什么类型的变
量,甚至它有可能不是变量而是一个函数。这样,编译器只能遗憾地给出一个编译错误的提示,并结束
编译了。
int result;
你必须像上面这样,声明有一个变量,名字叫 result ,类型是 int 。接下来,编辑器就能记
下 result 为一个 int 类型的变量。在后面的代码中,即可愉快地使用这个 result 变量了。