1. C语言入门
计算机程序语言主要是通过代码实例来学习,毕竟它是一项应用工具嘛,对实践要求很高。而且写出代码并成功运行总能给人一种学习的积极正反馈,让你充满成就感,高兴得停不下来~
来来来,跟着panda,抛开IDE集成开发环境,在Linux操作系统下使用vim编辑器写C语言脚本,我们👇开始。
1.1 了解C语言程序的组成
(1)在Unix操作系统中,首先建立一个以“.c”为文件扩展名的文本,因为panda使用的是Linux操作系统,便通过“vi”建立了一个名为“hello.c”的文本。代码内容如下:
双斜杠 //
后面的内容表示注释哦~
#include <stdio.h> // 用于告诉编译器在本程序中包含标准输入/输出库的信息
main() // main函数通常会调用其他函数的帮助来完成某些工作;()内填写参数信息,在这里main函数不需要任何参数,因此用空参数表()表示
{ // 花括号{} 用来把函数中的语句括起来
printf("hello,world\n"); //在这里,main函数调用printf函数的帮助(一个用于打印输出的库函数):在此打印双引号中间的字符串
}
(2)然后通过在命令行中输入命令cc hello.c
(进行编译过程);
(3)如果内容没什么错误,编译过程顺利进行,会在当前目录中生成一个可执行文件"a.out";
(4)最后,在命令行中输入./a.out
即可打印出“hello,world”。
Tips:
- 为什么非要“./”再加上可执行文件名称呢?
还记得Linux 之 Bash -- shell 的变量功能(二)里曾经提到的变量 PATH 吗?文件执行时,linux 系统会去 PATH 里寻找执行所需要的文件,而大多数没有特殊设定的情况下,只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里(当前目录一般不在其中),因而在这里输入a.out
linux系统是找不到执行命令的,必须增加“./”告诉系统 :在当前目录下寻找。
1.1 语法小结
- 一个C语言程序,无论其大小如何,都是由函数和变量组成的
-- 函数的作用:指定所要执行的计算操作(其中包含一些语句)
-- 变量的作用 :用于存储计算过程中使用的值
-- 注意:main是一个特殊的函数名,每个程序都从main函数的起点开始执行,这意味着每个程序都必须在某个位置包含一个main函数- 函数之间进行数据交换的一种方法是调用函数向被调用函数提供一个值(称为参数)列表。(参数列表跟在函数名后面使用“()”括起来)
- 函数中的语句用“{}”括起来
- C语言提供的一些转义字符序列:\n(换行符);\t(制表符);\b(回退符);"(双引号);\(反斜杠本身)
1.2 了解变量与算数表达式
(1)同样,首先通过vim编辑器建立一个以“.c”为文件扩展名的文本1-2.c
吧,代码如下:
#include <stdio.h>
/* 当fahr=0,20,...,300时,分别打印华氏温度与摄氏温度对照表 */
main()
{ //在C语言中,所有变量都必须先声明后使用(声明 通常放在函数起始处,在任何可执行语句前)
int fahr,celsius; // int 表示其后所列变量为整数(声明 变量的属性)
int lower,upper,step;
lower=0; /*温度表的下限*/ //赋值语句:这里用来为变量设置初值,各条语句均以分号结束
upper=300; /*温度表的上限*/
step=20; /*步长*/
fahr=lower; // 为fahr赋值,起始为0
while(fahr<=upper){ //这里使用while循环语句重复输出各行; “()“内为循环条件;以下3句均为此while语句的循环体
celsius=5*(fahr-32)/9; //(想知道为什么不直接写成5/9吗?-->tips)
printf("%d\t%d\n",fahr,celsius); // %d:指定一个整型参数;\t:两者之间留一个制表符的空间;\n:换行
fahr=fahr+step; //while语句的循环体
}
}
(2)然后通过在命令行中输入命令cc 1-2.c
(进行编译过程);
(3)如果内容没什么错误,编译过程顺利进行,会在当前目录中生成一个可执行文件"a.out";
(4)最后,在命令行中输入./a.out
即可打印出一系列华氏温度与摄氏温度对照表👇。
Tips:
- 使用 缩进方式 提高程序的 逻辑结构
-- 正确的缩进及保留适当空格的程序设计风格对程序的易读性非常重要
-- 建议每行只书写一条语句,并在运算符两边加上一个空格字符(使运算的结合关系更清楚明了) -
celsius=5*(fahr-32)/9
为什么不写成celsius=(5/9)*(fahr-32)
-- 因为在C语言及许多其他语言中,整数除法操作 将执行 舍位(结果中的任何小数部分都会被舍弃),由于5和9都是整数,5/9相除后截取所得到的结果为0,如此一来,这样求得的所有摄氏温度都将为0。
(bash环境中的数值运算也是这样的,它的预设最多仅能达 整数状态,这个在Linux 之 Bash -- shell 的变量功能(二)中提到过,感兴趣的朋友可以点击连接查看)
-- 解决措施:可以改变 变量的属性 :使用float fahr,celsius
代替int fahr,celsius
- 如果某个算数运算符的所有操作均为整型,则执行整型运算。但是,如果某个算数运算符有一个浮点型操作数和一个整型操作数,则在开始运算之前,整型操作数将会被转换为浮点型
-- 即便如此,代码书写时最好还是为整型值加一个显式的小数点,以强调其浮点性质
eg :celsius=(5.0/9.0)*(fahr-32.0)
(浮点数除法 就没有 舍位 这个特性了,可以大胆得把他们写一起了)
1.2 语法小结
- C语言中的注释:/* 与 */之间的字符序列被称为 注释,可以自由地运用在程序中。
- C语言中的一些基本数据类型: char 字符;ashort 短整型;long 长整型;double 双精度浮点型
- while循环语句的执行方式:
-- 首先测试“()”中的条件,如果条件为真,执行循环体
-- 再次测试“()”中的条件,如果条件为真,再次执行循环体
-- ......(如此循环)
-- 当测试“()”中的条件,如果条件为假,循环结束。然后执行跟在while循环语句之后的下一条语句- while语句的循环体是“{}”括起来的一条或多条语句
- printf 函数
-- 一个通用输出格式化函数
-- 该函数的第一个参数是待打印的字符串,其中的每个百分号(%)表示其他的参数之一进行替换的位置,并指定打印格式。
eg : 以printf("%d\t%d\n",fahr,celsius)
为例:第一个%
指代fahr
; 第二个%
指代celsius
--%d
按照十进制整型数打印
--%6d
按照十进制整型数打印,至少6个字符宽
--%f
按照浮点数打印
--%6f
按照浮点数打印,至少6个字符宽
--%.2f
按照浮点数打印,小数点后有2位小数
--%6.2f
按照浮点数打印,至少6个字符宽,小数点后有两位小数
--%o
表示八进制数;%x
表示十六进制数;%c
表示字符;%s
表示字符串;%%
表示百分号(%)本身
1.3 for 语句
同样是做一个华氏温度与摄氏温度的转换表,这次换 for 语句 来编写程序:
#include <stdio.h>
/*打印华氏温度-摄氏温度对照表*/
main()
{
int fahr;
for (fahr=0;fahr<=300;fahr=fahr+20){
printf("%3d %6.1f \n",fahr,(5.0/9.0)*(fahr-32));
}
}
for 语句与while语句一样,都是先测试“()”内的条件,然后执行“{}”中的循环体,实际编程过程中,主要看使用哪一种更清晰。
for 语句比较适合初始化和增加步长都是单条语句并且逻辑相关的情形,因为它将循环控制语句集中放在一起,比while语句更紧凑。
1.3 语法小结
- for 循环语句的执行方式与 while 循环语句相同,都是先测试“()”内的条件,满足条件后再执行“{}”中的循环
- for 循环语句的循环体形式与while语句相同,都是“{}”括起来的一条或多条语句
1.4 符号常量
赋予一些数字有意义的名字,可以提供给阅读该程序的人一定信息,使程序的修改变得更加容易。在这里,我们需要使用 #define指令,来把符号名(或称为符号常量)定义为一个特定的字符串,#define 名字 替换文本
。
这里还是以温度转换的代码为例:
#include <stdio.h>
#define LOWER 0 /*表的下限*/ // 因为LOWER,UPPER,STEP都是符号常量,因此不需要出现在声明里
#define UPPER 300 /*表的上限*/
#define STEP 20 /*步长*/
/*打印华氏温度-摄氏温度对照表*/
main()
{
int fahr;
for (fahr=LOWER;fahr<=UPPER;fahr=fahr+STEP){
printf("%3d %6.1f \n",fahr,(5.0/9.0)*(fahr-32));
}
}
1.4 语法小结
- 符号常量名通常用 大写字母 拼写(与 小写字母 拼写的 变量名 相区别)
- 注意:#define指令行末尾没有分号