一个C程序可以由若干个源程序文件(编译时以文件模块为单位)组成,一个源文件可以由若干个函数和预处理指令以及全局变量声明部分组成。
一个函数包含声明部分和执行部分。
执行部分是由语句组成的,语句的作用是向计算机系统发出操作指令,要求执行相应的操作。
声明部分不是语句,它不产生机器指令,只是对有关数据的声明。
graph TD
C程序 --> 源程序文件1
C程序 --> 源程序文件2
C程序 --> 源程序文件3
C程序 --> ...
C程序 --> 源程序文件n
源程序文件3 --> 预处理指令
源程序文件3 --> 数据_声明
源程序文件3 --> 函数1
源程序文件3 --> 函数2
源程序文件3 --> ....
源程序文件3 --> 函数n
函数1 --> 函数首部
函数1 --> 函数体
函数体 --> 数据声明
函数体 --> 执行语句
C语句
控制语句
| 语句 | 说明 |
|---|---|
| if()...else... | 条件语句 |
| for()... | 循环语句 |
| while... | 循环语句 |
| do...while... | 循环语句 |
| continue | 结束本次循环语句 |
| break | 中止执行switch或循环语句 |
| switch | 多分支选择语句 |
| return | 从函数返回语句 |
| goto | 转向语句,在结构化程序中基本不用 |
函数调用语句
函数调用语句由一个函数调用加一个分号构成
表达式语句
表达式语句由一个表达式加一个分号构成,即一个表达式的最后加一个分号就成了一个语句。
空语句
空语句可以用来作为流程的转向点(流程从程序其他地方转到此语句处),也可用来作为循环语句中的循环体(循环体是语句,表示循环体什么也不做)
复合语句
可以用{}把一些语句和声明可以括起来成为复合语句(又称语句块)。
注意: 复合语句中最后一个语句中最后的分号不能忽略不写。
赋值语句
赋值语句中的类型转换
- 浮点型数据赋值给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋值给整数变量。
- 整数型数据赋值给浮点数变量时,数值不变,但以浮点数形式存储到变量中。
- double型数据赋值给float型数据时,先将双精度数据转换为单精度,即只取6~7位有效数字,存储到float变量的4个字节中。注意:双精度数值的大小不能超出float型变量的数值范围,否则数据会失真。
- float型数据赋给double型数据时,数值不变,在内存中以8个字节存储,有效为数扩展到15位。
- 字符型数据给整形数据时,将字符的ASCII代码赋值给整型变量。
- 将一个占字节多的整形数据赋给一个占字节少的整形变量或字符变量时,只将其低字节原封不动地送到被赋值的变量(即发生截断,数据失真)。
总结: (1)整形数据之间的赋值,按存储单元中的存储形式传送。
(2)浮点型数据中间以及整形与浮点型数据之间的赋值,是先转换类型后赋值。
注意: 要区分赋值表达式和赋值语句:赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号。在一个表达式中可以含一个或多个赋值表达式,但绝不能包含赋值语句。
if((a=b)>0) max = a; //a=b是赋值表达式,可以运行。
//先进行赋值,,然后判断a是否大于0,如果大于0,执行max = a;
if((a=b;)>0) max = a; //此语句是错误的,a = b; 是赋值语句
数据的输入和输出
输入输出的基本概念
- 输入输出是以计算机主体为主体而言的。从计算机向输出设备(显示器、打印机等)输出数据成为输出,从输入设备(键盘、磁盘、光耦按等)向计算机输入数据称为输入。
- C语言本身不提供输入输出语句,输入输出操作由C标准函数库中的函数来实现的。
| 语句 | 说明 |
|---|---|
| putchar | 输出字符 |
| getchar | 输入字符 |
| printf | 格式输出 |
| scanf | 格式输入 |
| puts | 输出字符串 |
| gets | 输入字符串 |
- 在使用系统库函数时,要在程序文件的开头用预处理指令#include把有关头文件放在本程序中。如#include <stdio.h>
printf函数 -- printf(格式控制,输出表列)
- 格式控制:用双括号括起来的一个字符串,称“转换控制字符串”,简称“格式字符串”
(1)格式声明:由%和格式字符组成。作用是将输出的数据转换为指定的格式然后输出。
(2)普通字符:普通字符即需要在输出时原样输出的字符。 - 输出表列:程序需要输出的一些数据,可以是常量、变量或表达式。
- 格式字符
(1)d格式符:用来输出一个有符号的十进制数。
ld:输出long型数据。lld:输出long long型数据。
eg:printf("%5d",12); //%5d 表示输出数据占5列,输出的数据显示在此5列区域的右侧。12前面有3个空格。
(2)c格式符:用来输出一个字符。
(3)s格式符:用来输出整个字符串。
(4)f格式符:用来输出浮点型数字,以小数形式输出。
基本型:%f --- 不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。系统处理的方法一般是:实数中的整数部分全部输出,小数部分输出6位。
指定数据宽度和小数位数,用%m.nf。
输出的数据向左对齐,用%-m.nf。
eg:printf("%-25.15f,%25.15f\n",a,a);
// 第一个输出时向左端靠,右端空5列。第二个输出时靠右端靠,左边空5列。
(5)e格式符:指定以指数形式输出浮点数。默认数字部分6位,指数部分占5列。
eg:printf("%e",123.456); // 1.234560e+002 -- 234560->6列 e+002->5列
(6)o格式符:以八进制整数形式输出。将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。
(7)x格式符:以十六进制数形式输出整数。
eg:int a = -1; printf("%d,%o,%x",a,a,a);// -1,37777777777,ffffffff
(8)u格式符:用来输出无符号(unsigned)型数据,以十进制整数形式输出。
(9)g格式符:用来输出浮点数。
注意:
- printf函数输出时,务必注意输出对象的类型应与上述格式说明匹配,否则会报错;
- 除了X,E,G外,其他格式字符必须用小写字母,如%d不能写成%D;
- 如果想输出字符%,应该在格式控制字符串中用连续两个“%”表示,如:printf("%%");
scanf函数 -- scanf(格式控制,地址表列)
- 格式控制:同printf函数。
- 地址表列:由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。 eg:scanf("a=%f,b=%d"&a,&b);
注意:
- scanf函数中的“格式控制”后面应当时变量地址,而不是变量名。
- 如果在“格式控制字符串”中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符。
eg:scanf("a=%d,b=%d",&a,&b);//输入 -- a=1,b=2 enter - 在用“%c”格式声明输入字符时,空格字符和“转义字符”中的字符都作为有效字符输入。
- 在用%c输入数值时,在两个数值中间需要插入空格(或者其他分隔符),以使系统能够区分两个字符。
- 在输入数值数据时,如输入空格、回车,Tab键或遇非法字符(不属于数值的字符)认为该数据结束。
putchar函数 -- putchar(c)
c是字符常量、整型常量、字符变量或整型变量(其值在字符的ASCII代码范围内)
getchar函数 -- getchar()
eg:int a = getchar();
- 在用键盘输入信息时,并不是在键盘上敲一个字符,该字符就立即送到计算机中去的。这些字符先暂存在键盘的缓冲器中,只有按了enter键才把这些字符一起输入到计算机中,然后按先后顺序分别赋给相应的变量。
- 执行getchar函数不仅可以从输入设备获得一个可以显示的字符,并且可以获得在屏幕上无法显示的字符,如控制字符。