1-为什么学习C语言
你可能会从别的老师、师兄那得到这样的答案——“将来有可能会用到的”、“这是基本的程序素养,锻炼一下以后有好处”。
你为什么学?
1) 只是希望考试,考完不准备继续用,但还是想考好。
2) 希望投身计算机科学,获得可以和优秀的人一起共事的机会,进入大企业创造社会价值或进入优秀的研究院改变世界。
2-用C语言编程的环境
开发工具的选择
编程环境自行选择,自行百度!
我用的是Linux环境下的vim。
对于程序语言的初学者来说,不要轻易地使用太复杂的 IDE(integrated development environment,集成式开发环境) 。IDE 会隐藏很多本来应该让你学习到的知识,让你丧失很多学习的乐趣,也会让你变“笨”(如果你坚持要使用 IDE,对于初学的你,我们推荐你使用 Code::Blocks 或 Dev C++ 这种相对轻量的 IDE)。
推荐你使用 Vim 编辑器。
如果可能,你都可以试一试,找到你最喜欢、用起来最顺手的那个(在编辑器的选择上没有“最好”,只有“最适合你”,千万不要太纠结)。
从代码到程序的完整过程如下图:
从代码到程序
你编写的 C 语言程序通常以.c结尾,例如main.c。对于一个文件,可以通过执行gcc -o program main.c进行 编译(compile) ,告诉一个叫gcc的编译器,我们要编译生成一个名叫program的可执行文件(用-o program进行说明),被编译的代码文件是 main.c。
如果编译成功,我们在同一个目录下可以得到一个编译后的可以执行的program程序。再通过执行./program的方式你就可以运行这个程序了。
编写第一个程序的步骤:
1)在配置好的Linux环境里,输入 vim a.c 进入文件,按 i 开始编辑写程序代码
2)内容如下:
1 #include <stdio.h>
2 int main() {
3 printf("Hello World\n");
4 return 0;
5 }
3)然后按Ese,输入 :wq (冒号wq是保存退出的意思)回车退出
4)编译程序:gcc -o program a.c
5)执行程序./program , 然后命令行输出 Hello World
3-你的第一个C语言程序
如图,想一想下面的几个问题。
你刚刚用过printf来输出了“Hello”。你有没有想问一下printf是个什么东西呢?其实,我们通过#include<stdio.h>这行代码引入了一个名为stdio( Standard Input & Output)的 库(library) ,而printf则是一个在这个库中被定义的函数(function),因为我们引入了这个库,你就可以用这个函数了。
而其中用引号包裹的"Hello"则被称为函数接收的一个参数(parameter 或 argument)。当printf函数只有一个像我们写的"Hello"这样的参数时,会直接把Hello输出。至于其它printf函数的用法,你将在之后的课程中学习到。
我们已经知道,这段代码中#include <stdio.h>帮助我们引入了一个用于标准输入输出的库,这其中呢,就包括了我们用于输出的printf函数。
我们会发现,除了我们已知的部分外,剩下的代码如下:
1 int main() {
2 return 0;
3 }
这部分代码其实完成了一个名叫main的函数的实现。它是一个特殊的函数,多数时候main函数被规定为 C 语言程序运行的入口。我们一系列的程序逻辑的拟写,都需要在main这个函数的大括号所包围的范围内完成。也就是说,当我们的 C 语言程序被编译、运行时,一切有效的逻辑,将会从main函数大括号内第一行语句开始。
这份代码中你尚未理解的部分,应该只剩下int和return 0了吧?
在这里,int表示了我们预期的函数的返回值类型—— 整数(integer) , int就是取自整数英文单词“integer”的前三个字母。而return 0就是在main函数的结束位置将一个整数 0 作为main函数的 返回值(return value) 交给 操作系统(operating system) 。操作系统接收到程序返回的 0 时就会认为程序正常结束,而如果接收到其他数值(无论是正整数还是负整数)则会认为程序非正常结束。
函数的基本结构
在 C 语言中,我们可以实现一些自己的函数,形如:
1 [返回值类型] [函数名]([参数]) {
2 [函数内的语句]
3 return [返回值];
4 }
函数调用
我们也可以在 C 语言中用通过[函数名]([传入参数值])的形式调用我们的函数,让函数内语句实现的逻辑被执行。在之后的课程中我们用专门的一章对函数进行讨论。
无处不在的函数
“函数的英文function,直译过来就是【功能】,每一个函数其实就对应了一种功能。编程就是发挥不同功能的积木的堆积,搭好了就能解决巨大的问题”
C语言是由函数组成的
我们之后开发 C 语言程序的过程,其实也是将包含了各自逻辑意义的函数互相调用的过程(就像我们已经在main函数中调用了printf函数这样)。只不过这些函数中,有一些是外部的库中已经定义好的,我们引入了库就可以使用,比如printf是一个在stdio的库中已经定义好了可以直接使用的,而另一些可能需要你自己去定义、实现之后,你才可以进一步去进行调用。
不知道你晕菜了没有……如果没有晕,老师在这里赞一下你的“天资聪慧”!如果你已经晕了,那也没关系,后面我们还会给你很多的机会慢慢弄懂这些内容的。
4-将变量嵌入输出
#include <stdio.h>
int main() {
int number;
char alpha;
// 在上面声明了两个变量,请在下面给他们赋值
number = 1;
alpha = 'A';
printf("%c is %dst letter",alpha,number);
return 0;
}
第一个参数中的占位符的数量与printf除第一个参数外的其他参数数量相等,并且一一对应。例如,作为函数第一个参数的字符串"%c is %dst letter"中
·第一个占位符是 %c,那么它就对应了待嵌入的第一个变量 alpha ;
·第二个占位符是 %d,那么它就对应了带嵌入的第一个变量 number ;
·如果printf 第一个参数的字符串中有n个占位符,那么之后也应该有n个 待嵌入的变量作为参数与之对应。
5-变量名的使用
在C语言中合法的变量名需要满足以下条件:
·由大写字母、小写字母、数字、下划线
·不能以数字开头
·不能是int、return等特定含义的保留字
除此之外,为了保证程序容易被人理解,我们会尽可能的避免a,b之类没有具体含义的命名方式,而根据变量所代表的实际意义进行命名。
例如:·year表示年 ·month表示月 ·weather表示天气
6-变量的作用域
在之前的课程内容中,我们学习了变量的概念,并且对变量可以被使用的范围 —— 作用域进行了解释。我们说,我们可以简单的理解一个变量的 作用域(scope) 一般可以被界定为变量声明语句之后、包裹了它的声明语句的最内一层 {} 之内。例如下图中,对于变量 alpha,图中的绿色标记了包裹了它的声明语句的最内一层 {} 所在的区域;而黄色的剪头标记出了自它声明后,它的实际作用域范围(也就是作用域)。
读一下下面这个 C 语言程序,选出关于这个程序描述的所有正确选项(请注意,如果输出格式的引号中有 \n,程序输出的位置将换行)。
1 #include <stdio.h>
2 int main(){
3 int year;
4 year = 2011;
5 {
6 int month;
7 month = 5;
8 printf("%d年%d月\n", year, month);
9 year = 2016;
10 }
11 int month;
12 month = 3;
13 printf("%d年%d月\n", year, month);
14 return 0;
15 }