提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、编程规范
俗话说:没有规矩,不成方圆。虽然C语言中的代码书写格式形式相对自由,但是为了使编写的代码具有通用、友好的可读性,应尽量遵守一定的规范。
1.1代码缩进
C语言中,代码按递进层次依次向右缩进,每次缩进4个字符。不采用空格,而采用Tab键制表位,以保证缩进的对齐。
#include<stdio.h>
int main() //主函数main
{
int iResult = 0; //定义变量
int i;
printf("由1加到100的结果是:"); //输出语句
for (i = 1; i <=100; i++)
{ //不同层次的代码缩进
iResult = i + iResult;
}
printf("%d\n",iResult); //输出结果
return 0; //结束返回
}
1.2变量、常量命名规范
常量的命名统一为大写格式。如果是成员变量,均以m_开始。如果是普通变量,取与实际意义相关的名称,并且名称的首字母要大写,再在前面添加类型的首字母。如果是指针,则在其标识符前添加p字符,并且名称首字母要大写。例如:
#define AGE 28 //定义常量
int m_iAge; //定义整型成员变量
int iNumber; //定义普通整型变量
int* pAge; //定义指针变量
1.3函数的命名规范
定义函数时,函数名的首字母要大写,其后面的字母根据含义大小写混合。例如:
int AddTwoNum(int num1,int num2);
1.4注释
尽量采用行注释。如果行注释与代码处于一行,则注释应位于代码右方。如果出现连续多个行注释
二、关键字
关键字(Keywords),又称保留字,是C语言规定的具有特定意义的字符串,C语言中有32个关键字。如下表所示。包含用户定义的常量、变量、函数等名称不能与关键字相同,否则会出现错误。
2.1 32个关键字表格
序号 | 关键字 | 解释 | 序号 | 关键字 | 解释 |
---|---|---|---|---|---|
1 | auto | 声明自动变量 | 17 | int | 声明整型变量或函数 |
2 | break | 跳出当前循环 | 18 | long | 声明长整型变量或函数返回值类型 |
3 | case | 开关语句分支 | 19 | register | 声明寄存器变量 |
4 | char | 声明字符型变量或函数返回值类型 | 20 | union | 子程序返回语句 |
5 | const | 声明制度变量 | 21 | short | 声明短整型变量或函数 |
6 | continue | 结束当前循环,开始下一环节 | 22 | signed | 声明有符号类型变量或函数 |
7 | default | 开关语句中的“其他”分支 | 23 | sizeof | 计算数据类型或变量长度(即所占字节数) |
8 | do | 循环语句的循环体 | 24 | static | 声明静态变量 |
9 | double | 声明双精度浮点型变量或函数返回值类型 | 25 | stuct | 声明结构体类型 |
10 | else | 条件语句否定分支(与if连用) | 26 | switch | 用于开关语句 |
11 | enum | 声明枚举类型 | 27 | typedef | 用以给数据类型取别名 |
12 | extern | 声明变量或函数是在其他文件或本文件的其他位置定义 | 28 | return | 子程序返回语句(可以带参数,也可以不带参数) |
13 | float | 声明浮点型变量或函数返回值类型 | 29 | unsigned | 声明无符号类型变量或函数 |
14 | for | 一种循环语句 | 30 | void | 声明函数无返回值或无参数,声明无类型指针 |
15 | goto | 无条件跳转语句 | 31 | volatile | 声明变量在程序执行过程中可被隐含地改变 |
16 | while | 循环语句的循环条件 | 32 | if | 条件语句 |
三、标识符
C语言中,为了在程序的运行过程中可以使用变量、常量、函数、数组等,就要为这些形式设定一个名称,而设的的名称就是所谓的标识符。
标识符的名称设定比较自由,开发者可以设定自己喜欢且容易理解的各类名称。但这并不意味着可以随意自由的发挥,下面介绍设定C语言标识符时应该遵守的一些基本命名规则。
3.1标识符约束
- 标识符必须以字母或下划线开头,而不能以数字或者符号开头。例如:
int $num; //错误,标识符第一个字符不能为符号
int 2hao; //错误,标识符第一个字符不能为数字
int num; //正确,标识符第一个字符为字母
int_hao; //正确,标识符第一个字符为下划线
- 标识符中,除开头外的其他字符可以由字母、下划线或数字组成。例如:
int good_way; //正确,标识符中可以有下划线
int bus7; //正确,标识符中可以有数字
int car6V; //正确
- C语言区分大小写,也就是说,大写或小写的英文字母代表的是不同的标识符。例如,下面的代码给出了3个不同的标识符。
int mingri; //全部是小写
int MINGRI; //全部是大写
int MingRi; //一部分是小写,一部分是大写
可以看出,标识符中只要有一个字符不同,其代表的就是一个新的名称。
- 标识符不能是关键字。例如,系统使用int关键字表示整型数据类型,因此用户定义的标识符就不能再使用int,否则会提示编译错误。但将其中的某个字母改成大写字母后,就可以通过编译。
int int; //错误,int为系统关键字
int Int; //正确,int不再为关键字
5.标识符应体现一定的功能含义,便于理解。通常采用所表述内容的英文、拼音等,这样即便是没有备注,只直观地查看代码,也能快速了解到其表述的作用及功能。
例如:定义一个长方形的长、宽、高时,如果将其简单的定义为a,b,c,则没有后面的注释就很难理解。相比之下,iLong、iWidth、iHeight这样的标识符更清晰、明了,推荐大家采用。
int a; //长方体的长
int b; //长方体的宽
int c; //长方体的高
int iLong; //长方体的长
int iWidth; //长方体的宽
int iHeight; //长方体的高
- ANSI标准规定,标识符可以为任意长度,但外部名必须保证前6个字符就能唯一地进行区分。这是因为某些编译程序(如IBM C 的MSC)仅能识别前6个字符。
四、数据类型
程序要解决复杂的问题,就要处理不同的数据。不同的数据类型,如整数、字符型、实型等,在内存中占用的存储空间大小也不同。
C语言中的数据类型包括基本类型、构造类型、指针类型和空类型等,如下流程图所示:
4.1基本类型
基本类型是C语言中的基础类型,包括整型、字符型、实型(浮点型)、枚举型4类。
4.2构造类型
当基本类型不能满足需要时,开发者可以自行构造数据类型。及使用基本类型数据,或已构造好的数据类型,通过添加、设计、组合,形成能满足待解决问题需要的新的数据类型。
构造类型是由多种类型组合而成的新类型,其每个组成部分都称为成员。构造类型包括数组类型、结构体类型和共用体类型3类。
4.3指针类型
指针是C语言的精华。指针类型不同于其他类型,因为其值表示的是某个内存地址。
4.4空类型
空类型的关键字是void,主要用于对函数返回值和函数参数进行限定。
函数一般具有一个返回值(返给调用者),这个返回值应该具有特定的类型,如整型int。当函数不需要返回值时,就可以使用空类型进行设定。
五、常量
5.1整型常量
整型常量就是整型常数(没有小数点部分),如123、-456等。有十进制、八进制和十六进制3种表示形式。
- 十进制:我们日常所见到的整数都是十进制的,如1234567890等。十进制数使用0~9来表示所有数,递进关系为逢十进一。注意,除了0本身,其他十进制数不能以0开头。
- 八进制:使用0~7来表示所有的数,递进关系为逢八进一。八进制常量前要加上0作为前缀,如0123、0432等。
- 十六进制:使用0-9和字母A-F(或a-f)来表示所有的数,递进关系为逢十进一。十六进制常量前要加上0x作为前缀,如0x123,0x3ba4。
整型常量可以是基本整型(int)、长整型(Long int)或短整型(Short int),还可以是无符号整型(Unsigned)或有符号(Signed)整型。在常量后加上L(或l),表示该常量是长整型,如1234L;加上U(或u),表示该常量为无符号类型。如123U。 - 短整型是16位的,无符号短整型的取值范围是0~65535,有符号短整型的取值范围是-32768 ~ +32767。
- 长整型是32位的,无符号长整型的取值范围是0 ~ 4294967295,有符号长整型的取值范围是-2147483648 ~ +2147483647.
- 16位的计算机中,基本整型的取值范围和短整型相同;32位及以上计算机中,基本整型的取值范围和长度相同。
5.2实型常量
实型也称浮点型,由整数和小数两部分组成,并用十进制的小数点进行分割。表示实数的方式有小数和指数两种。
5.2.1小数形式
小数表示的方法就是使用十进制的小数方法描述实型。例如:
123.45; //小数表示方法
0.5458;
5.2.2指数形式(科学计数形式)
当实型数非常大或非常小时,可以用指数形式来表示。使用字母e或者E表示指数形式,如45e2表示的是45x10^2,即4500。
书写实型常量时,可以在常量后加上F或L后缀(大小写通用)。F表示该常量是float单精度类型,L表示该常量为long double长双精度类型。例如:
1.2345e2F; //单精度类型
5.458e-1L; //长双精度类型
如果不加后缀,则默认实型常量为double双精度类型。例如:
1.2345e2; //默认为双精度类型
5.3字符型常量
字符型常量与整型、实型有所不同,需要使用定界符进行限制。字符型常量包括两种:字符常量和字符串常量。
5.3.1字符常量
使用一对单直撇引号(’ ‘)括起来的字符就是字符常量,如’A’、‘#’、'b’等。
- 字符常量只能包括一个字符,不能是字符串。例如,'A’是正确的,但用’AB’来表示字符常量就是错误的。
- 字符常量是区分大小写的。例如,'A’和’a’代表的是不同的字符常量。
- ’ '代表的是定界符,不属于字符常量的一部分。
在下面的实例中,将演示putchar函数将多个字符常量依次输出,在控制台中显示"Find Day"。
#include<stdio.h>
int main()
{
putchar('F');
putchar('i');
putchar('n');
putchar('d');
putchar('\0'); //字符结束标志
putchar('D');
putchar('a');
putchar('y');
putchar('!');
putchar('\n'); //进行换行
return 0;
}
5.3.2字符串常量
字符串常量是用一对双直撇(" ")括起来的若干字符序列。例如,“Have a good day!“和"beautiful day"即为字符串常量。如果字符串中一个字符都没有,将其称作空串,此时字符串的长度为0。
在C语言中存储字符串常量时,系统会在字符串的末尾自动添加一个”\0”,作为字符串的结束标志。例如,字符串"welcome"在内存中的存储形式如下所示
w | e | l | c | o | m | e | \0 |
---|
例:打印《静夜思》诗句
在本实例中,使用pprintf函数将字符串常量《静夜思》诗句在控制台输出显示。
#include<stdio.h> //包含头文件
int main()
{
printf("床前明月光\n"); //输出字符串
printf("疑是地上霜\n");
printf("举头望明月\n");
printf("低头思故乡\n");
return 0; //程序结束
}
运行程序,结果如下图所示
总结起来就是字符常量和字符串常量的差别体现在以下的几个方面了:
1、定界符不同
2、长度不同
3、存储方式不同
5.4转义字符
在上文所示的例子中能看到"\n"符号,但输出的结果中却并不存在该符号,只是进行了替换操作,这种符号称为转义符号。
转义符号在字符常量中是一种特殊的字符,通常以反斜杠“\”开头,后面跟一个或几个字符。常用的转义字符及其含义如下表所示:
转义字符 | 意义 | 转义字符 | 意义 |
---|---|---|---|
\n | 回车换行 | \\ | 反斜杠“\” |
\t | 横向跳到下一指制表位置 | \’ | 单引号符 |
\v | 竖向跳格 | \a | 鸣铃 |
\b | 退格 | \ddd | 1~3位八进制数所代表的字符 |
\r | 回车 | \xhh | 1~2位十六进制数所代表的字符 |
\f | 走纸换页 |
5.5符号和常量
在之前的例子中,程序的功能是求解一个长方体的体积。因为题设中长方体的高度是固定的,所以使用符号名Height来代替固定的常量值10,这里使用的符号名酒称之为符号常量。使用符号常量的好处在于可以为编程和阅读带来方便。
例:小时和年之间的转换
(本实例使用符常量来表示一年有多少个小时(一年按365天来计算))。在控制台上显示文字,提示用户输入一个表示小时的事件数量的值。用户输入小时数后,经过计算得到对应的年数。并输出显示。
#include<stdio.h>
#define HOUR 365*24 //定义符号变量HOUR
int main()
{
int h, result; //定义变量
printf("请输入小时"); //提示输入数据
scanf_s("%d", &h); //输入数据
result = h / (HOUR); //进行计算
printf("一年一共有%d年\n", result); //显示结果
return 0; //程序结束
}
运行上图结果如下所示:
六、变量
在前面的学习中,我们已经多次接触过变量。变量就是在程序运行期间其值可以变化的量,每个变量都属于某种类型,如整型、实型、字符型等,该类型定义了变量的格式和行为。一个变量应该有属于自己的名称,并且在内存中占有一定的存储空间,其所占空间大小取决于类型。
6.1整型变量
整型变量是用来存储数值的变量。整型变量可以分为如下表所示的6中类型,其中基本类型的符号使用int关键字,在此基础上可以根据需要加上一些符号进行修饰,如关键字short或long。
类型 | 关键字 | 类型 | 关键字 |
---|---|---|---|
有符号基本整型 | [signed] int | 无符号短整型 | unsigned short [int] |
无符号基本整型 | unsigned [int] | 有符号长整型 | [signed] long [int] |
有符号短整型 | [signed] short [int] | 无符号长整形 | unsigned long [int] |
表格中的[]为可选部分。例如[signed] int,在书写的时候可以省略signed关键字
6.1.1有符号基本整型
有符号基本整型是指signed int 型,其值是基本的整型常数。编写时,常将其关键字signed进行省略。有符号基本整型在内存中占用4个字节,取值范围-2147483648-2147483648.
通常说到的整型,都是指有符号基本整型int
定义一个有符号整型变量方法是在变量前使用关键字int。例如,定义一个整型变量iNumber,并为其赋值-10的方法如下:
int iNumber; //定义有符号变量
iNumber=-10; //为变量赋值
或者在定义变量的同时为其赋值:
int iNumber=-10; //定义有符号基本整型变量的同时进行赋值
注意:程序中用到的变量应集中定义,并放在变量赋值之前,否则会产生错误。
例如:
/*正确写法*/
int iNumber1; //先定义变量
int iNumber2;
iNumber1=6; //再对变量赋值
iNumber2=7;
/*错误写法*/
int iNumber1; //定义变量
iNumber1=6; //为变量赋值,错误!!因为赋值语句在定义变量语句之前
int iNumber2; //定义变量
iNumber2=7; //为变量赋值
输出有符号int类型取值范围
#include<stdio.h>
int main()
{
signed int i,j; //定义有符号基本整型变量
i=-2147483648; //为变量赋值
j=2147483647; //为变量赋值
printf("有符号整型变量最小值是%d\n",i); //显示整型变量
printf("有符号整型变量最小值是%d\n",j); //显示整型变量
return 0;
}
6.1.2无符号基本整型
无符号基本整型使用的关键字是unsigned int,其中的关键字int在编写时可以省略。无符号基本整型在内存中占用4个字节,取值范围0~4294967295.
定义一个无符号基本整型变量的方法是在变量前使用关键字unsigned。例如,要定义一个无符号基本整型变量iUnsignedNum,并为其赋值111的方法如下
unsigned iUnsignedNum; //定义无符号基本整型变量
iUnsignedNum=111; //为变量符号
6.1.3有符号短整型
有符号短整型使用的关键字是signed short int,其中的关键字是signed和int在编写时可以省略。无符号短整型在内存中占两个字节,取值范围是0~65535。
定义一个无符号短整型变量的方法是在变量前使用关键字unsigned short。例如,要定义一个无符号短整型变量iUnsignedShtNum,并为其赋值222的方法如下:
unsigned short iUnsignedShtNum; //定义无符号短整型变量
iUnsignedShtNum=222; //为变量赋值
6.1.4无符号短整型
无符号短整型使用的关键字是unsigned short int,其中的关键字int在编写时可以省略。无符号短整型在内存中占两个字节,取值范围是0~65535.
定义一个无符号短整型变量的方法是在变量前使用关键字unsigned short。例如:
要定义一个无符号短整型变量iUnsignedShtNum,并为其赋值222的方式如下:
unsigned short iUnsignedShtNum; //定义无符号短整型变量
iUnsignedShtNum=222; //为变量赋值
6.1.5有符号长整型
有符号长整型使用的关键字是signed long int,其中的关键字signed和int在编写的时候可以省略,有符号长整型在内存中占用4个字节,取值范围是-2147483648~2147483647。
定义一个有符号长整型变量的方法是在变量前使用关键字Long。例如,要定义一个有符号长整型变量iLongNum,并为其赋值-333333的方法如下:
long iLongNuml; //定义有符号长整型变量
iLongNum=-333333L; //为变量赋值
6.1.6无符号长整型
无符号长整型使用的关键字是unsigned long int,其中的关键字int在编写时可以省略。无符号长整型在内存中4个字节,取值范围是0~4294967295。
定义一个无符号长整型变量的方法是在变量前使用关键字unsigned long。例如,要定义一个无符号长整型变量iUnsignedLongNum,并为其赋值6666666的方法如下:
unsigned long iUnsignedLongNum; //定义无符号长整型变量
iUnsignedLongNum=6666666L; //为变量赋值
6.2实型变量
实型变量也称为浮点型变量,是用来存储实现数值的变量,其中实行数值由整数和小数两部分组成。实型变量根据精度可以分成单精度、双精度类型和长双精度类型3种。
6.2.1单精度类型
单精度类型使用的关键字是float,它在内存中占4个字节,取值范围是-3.4x10-38~3.4x1038。
定义一个单精度类型变量的方法是在变量前使用关键字float。例如,要定义一个变量fFloatStyle,并为其赋值3.14的方式如下:
float fFloatStyle; //定义单精度类型变量
fFloatStyle=3.14f; //为变量赋值
例:存款一年后能去除多少钱
已知银行的年利率是2.95%,如果在银行中存入1000元,一年后可以取出多少钱?(总额=本金+年利率*本金)。
#intclude<stdio.h>
int main()
{
float result; //定义单精度类型变量
result=1000+0.295*1000; //计算一年后可取出的本金+利息总额
printf("result=%f\n",result); //显示结果
return 0; //程序结束
}
运行程序结果如下图
6.2.2双精度类型
双精度类型使用的关键字是double,它在内存中占用8个字节,取值范围是-1.7x10-308~1.7-10308。
定义一个双精度类型变量的方法是在变量前使用关键字double。例如,要定义一个变量dDoubleStyle,并为其赋值5.321的方法如下:
double dDoubleStyle; //定义双精度类型变量
dDoubleStyle=5.321 //为变量赋值
例子:计算圆柱体的粮仓和屯粮量:一个圆柱体的粮仓,底面直径为50米,高为15米,该粮仓体积为多少立方米?如果每立方米能屯粮896千克,该粮仓一共可以存粮多少千克?
(体积=3.14rh)
#include<stdio.h>
int main()
{
double d, h, v, res;
d = 50;
h = 15;
v = 3.14 * (d / 2) * (d / 2)* h;
printf("该粮仓体积为%f立方米\n", v);
res = 896 * v;
printf("该粮仓一共可以存粮%f千克粮食\n", res);
return 0;
}
运行结果如下图所示:
6.2.3长双精度类型
长双进度类型使用的关键字是long double,它在内存中占8个字节,取值范围是-1.7x10-308~1.7x10308。
定义一个双精度类型变量的方法是在变量前使用关键字long double。例如,要定义一个变量fLongDouble,并为其赋值为46.257的方法如下:
long double fLongDouble; //定义长双精度类型变量
fLongDouble=46.257; //为变量赋值
例子:记录太阳和火星之间的距离
在本例子中,定义一个长双精度类型变量表示太阳和火星之间的距离,然后为其赋值22.794,最后通过输出语句将其显示在控制台.
#include<stdio.h>
int main()
{
long double fLongDouble; //定义长双精度变量
fLongDouble = 22.794;
printf("火星距离太阳有%f亿千米\n",fLongDouble);
return 0;
}