一、数据的表现形式及其运算
1.1 常量和变量
1. 常量:在程序运行中不能被改变的量被称为常量。
常用的常量可分为:
- 整型常量(如9,100,-19等)。
- 实型常量(有两种表现形式:a、十进制小数,如12.34,0.53;b、指数形式,如1.23e3,代表1.23乘以是的三次方)。
- 字符型常量(有两种形式:a、普通字符,用单撇号括起来的一个字符,如:'a','A','3','?'等,注意一定是单撇号,里边只有一个字符,它在计算机中是用代码存储的,例如字符'a'它的ASCII代码是97,将97转化成二进制,然后放计算机内;b、转义字符,他是以字符“\”开头的字符序列,常用的见表1.1)。
转义字符 | 字符值 |
\n | 换行 |
\t | 水平制表符 |
\o、\oo或\ooo | 为与该八进制码对应的ASCII字符 |
\\ | 一个反斜杠(\) |
\' | 一个单撇号(') |
\'' | 一个双撇号(") |
- 字符串常量(由双撇号括起来的若干个字符,如"boy","123"等)。
- 符号常量(用#define指令,指定用一个符号名称代表一个常量。如:#define PI 3.1415 。符号常量最后没有分号)。
2. 变量:变量代表一个有名字的、具有特定属性的一个存储单元,它用来存放数据。
变量必须先定义后使用,定义时指明变量的名字和类型。变量名实际上是一个名字代表的一个存储地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。
3. 常变量:在定义变量时,前面加一个关键字const,例如:const int a = 7;
常变量与常量的异同是:常变量具有变量的基本属性:有类型,占内存单元,只是不允许改变其值。常变量相当于有名字的不变量,而常量是没有名字的不变量。
4. 标识符:用来对变量、符号常量量名、函数、数组、类型等命名的有效字符序列。
标识符只能由字母、数字和下画线3种字符组成,且第一个字符必须为字母或下画线。
1.2 数据类型
在计算机中,数据是存放在存储单元中的,它是具体存在的。存储单元是由有限的字节构成的,每一个存储单元中存放的数据范围是有限的。C语言允许使用的类型如图1.2所示,*为C99所增加。
1.3 整型数据
1. 整型数据分类
基本整型(int型)
编译系统分配给int型数据2个字节或者4个字节(具体由编译系统自行决定),可以使用sizeof运算符查看。在存储单元中的存储方式是:整数的补码形式存放。能表示的值的范围为:2的(字节个数乘以8-1)次方~2的(字节个数乘以8-1)次方-1,例如4四字节就是-2¹⁵~2¹⁵-1.
短整型(short int)
类型名为short int 或 short,Visual C++中短整型占2个字节。
长整型(long int)
类型名为long int 或 long。分配的字符可用sizeof查看。
双长整型(long long int)
类型名为long long int 或 long long,一般分配8个字节。这是C99新增的,有些C编译器尚未实现。
2. 整型变量的符号属性
以上的变量值在存储单元中都是以补码的形式存储,之所以要字节个数乘以8-1是因为一个字节有8个位,存储单元中的第一个位代表符号。为了充分利用变量的值的范围,可以将变量定义为无符号类型。可以在类型符号前加上修饰符unsigned (只有整型数据才可以加),表示指定该变量是“无符号整数”类型(例如:unsigned int)。因为左边最高位不在用来表示符号,而是用来表示数值,因此无符号整型变量的正数范围比有符号的表示的正数范围扩大了一倍。例子如图1.3所示。
1.4 字符型数据
字符代码是按整数形式存储的,因此字符型数据作为整型类型的一种。
1. 字符与字符代码
字符与字符代码并不是任意一个字符,只能使用系统字符集中的字符,目前大多数采用ASCII字符集,占一个字节。各种字符集的基本集都包括127个字符。其中有:
- 字母:大写英文字母A(65)~Z(90),小写英文字母a(97)~z(122)。
- 数字:0(48)~9(57)。
- 专门字符:29个,包括!"#&'()*+,-./:;<=>?[\]^_'{|}~
- 空格符:空格(32)、水平制表(09)、换行(10)、垂直制表符(11)、换页(12)。
- 不能显示字符:空null字符(0)、警告(07)、退格('08')、回车(13)。
2. 字符变量
字符变量是用类型符char定义字符变量。如:char c = '?';定义c为字符变量并使初始值为字符'?'。'?'的ASCII代码是63,系统将整数63赋给变量c。字符变量实质上是一个字节的整型变量。可以把0~127之间的整数赋给一个字符变量。
1.5 浮点型数据
浮点型数据是用来表示具有小数点的实数。浮点型包括float(单精度浮点型)、double(双精度浮点型)、long double(长双精度浮点型)。
1. float型(单精度浮点型)4字节。
2. double型(双精度浮点型)8字节。
3. long double型(长双精度)16字节(字节的具体多少看编译系统)。
二、运算符和表达式
2.1 C运算符
C语言提供了一下运算符:
算数运算符 | + - * / % ++ -- |
关系运算符 | > < == >= <= != |
逻辑运算符 | ! && || |
位运算符 | << >> ~ | ^ & |
赋值运算符 | =及其扩展赋值运算符 |
条件运算符 | ? : |
逗号运算符 | , |
指针运算符 | * 和 & |
求字节运算符 | sizeof |
强制类型转换运算符 | (类型) |
成员运算符 | . -> |
下标运算符 | [ ] |
其他 | 如函数调用运算符() |
2.2 基本的算数运算符
常用运算符如下表所述:
运算符 | 举例 | 结果 |
+ | +a | a的值 |
- | -a | a的算数负值 |
* | a*b | a和b的乘积 |
/ | a/b | a除以b的商 |
% | a%b | a除以b的余数 |
+ | a+b | a和b的和 |
- | a-b | a和b的差 |
注意:
- 两个整数相除,得到的是整数,如5/3的结果值为1,舍去小数部分。如果除数或者被除数中有一个为负值,则舍入方向是不固定的。
- %运算符要求参与运算的运算对象为整数,结果也是整数。
2.3 自增(++)、自减(--)运算符
自增(++)、自减(--)运算符的作用是使变量的值加1或减1(若地址的++或--增减的是指向下一个地址,而不是地址数字加1),,注意点:
- ++i,--i(在使用i之前,先使i值的加或减1)
- i++,i--(在使用i之后,使i的值加或减1)
2.4 算术表达式和运算符的优先级与结合性
3.5 不同类型数据间的混合运算
运算中遇到不同类型的数据进行运算时,会先自动进行类型转换,使之成为一种类型,然后进行计算。规律为:
- +、-、*、/运算的两个数中有一个数为float或double型,最后为double。
- 如果int型与float或double型数据进行运算,先将int或float类型转换成double型再计算,最后时double类型。
- 字符(char)型数据与整型数据进行运算,将字符的ASCII代码与整型数据进行运算。如果与实型数据进行计算,则为double类型。
3.6 强制类型转换运算符
可以利用强制类型转换符将一个表达式转换成所需类型,其一般形式为:(类型名)(表达式)。
三、C语句
3.1 C语句的作用和分类
C语句分为以下5类。
1. 控制语句。
用于完成一定的控制功能,C语言中只有9种。
- if()...else... 条件语句
- for()... 循环语句
- while()... 循环语句
- do...while 循环语句
- continue 结束本次循环
- break 中止执行switch或循环语句
- switch 多分支选择语句
- return 从函数返回语句
- goto 转向语句,在结构化程序种基本不用goto语句
()表示括号中是一个“判别条件”,“...”表示内嵌的语句。
2. 函数调用语句。
由一个函数调用加一个分号构成。例如:printf("你好");
3. 表达式语句。
由一个表达式加一个分号构成。注意的是:一个语句在最后必须有一个分号,分号是语句中不可缺少的组成部分。
4. 空语句。
就只有一个分号;,可以用来作为流程的转向点,也可以用来作为循环语句中的循环体。
5. 复合语句。
可以用{}把一些语句和声明括起来称为复合语句(又称语句块)。
3.2 最基本的语句——赋值语句
1. 赋值运算符
赋值运算符“=”就是赋值运算,他的作用是将一个数据赋给一个变量。可以将一个常量或者表达式赋值给一个变量。
2. 复合的赋值运算符
在赋值符=之前边加上其他运算符,可以构成复合的运算符。如“+=”,“-=”。
比如a += 7 等价于 a = a+7;a %= b+7 等价于 a = a%(b+7);
3. 赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为:
变量 赋值运算符 表达式 (例如:a = b)
4. 赋值过程中的类型转换
两侧一致,直接转换。
两侧不一致:
- 将浮点型数据赋值给整型变量时,先对浮点数取整,即舍去小数部分,然后赋值给整型变量。
- 将整型数据赋给单、双精度变量时,数值不变,但以浮点形式存储到变量中。
- 将一个double型数据赋值给float变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到float型变量的4个字节中。
- 字符型数据赋给整型变量时,将字符的ASCII代码赋给整型变量。
- 将一个占字节多的整型数据赋值给一个占字节少的整型变量或字符变量时,只将其低字节原封不动地送到被赋值的变量。
5. 赋值表达式和赋值语句
C语言的赋值语句属于表达式语句,由一个赋值表达式加一个分号组成。一个表达式中可以包含另一个表达式,但一个表达式中不能不好另一语句。
6. 变量赋初值
即变量最开始时的赋值,第一次赋值,若只声明没有赋值,是不可以将声明的变量再赋值给另外的变量。即若对几个刚声明的变量赋值只能一个一个赋,不能连赋。(比如可以:int a=7,b=7,c=7;但不可以int a=b=c=7;)
四、数据的输入输出
4.1 有关数据输入输出的概念
几乎每一个C程序都包含输入输出。因为要进行运算,就必须给出数据,而运算结果也需要输出,以便使用。
C语言本身不提供输入输出语句,输入输出操作是由C标准函数库中的函数来实现的。不同编译系统所提供的函数库中,输入输出函数也并非都是一样的。
C语言函数库中有一批标准输入输出函数,调用标准输入输出函数时所需的重要信息在stdio.h中,可以使用预处理指令#include调用它。(如:#include <stdio.h>)。其中有putchar(输出字符)、getchar(输入字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)和gets(输入字符串)。
4.2 用printf函数输出数据
在C程序中用来实现输出和输入的主要时printf函数和scanf函数。这两个函数是格式输入输出函数。即使用时需指定输入输出数据的格式。
1. printf函数的一般格式
一般格式为:printf(格式控制,输出表列);输出表列可以是常量、变量或表达式。
例如:printf("%d,%c\n",a,b)
2. 格式字符
- d格式符。用来输出一个有符号的十进制数,%d。
- c格式符。用来输出一个字符,%c。
- s格式符。用来输出一个字符串,%s。
- f格式符。用来输出实数(包括单、双、长精度),以小数的形式输出,%f。
- 指定数据宽度和小数位数,用%m.nf,m表示占的列,n表示小数位。
- 输出输出向左对齐,用%-m.nf,当数据长度不超过m时,数据向左靠拢,右端补空格。
故,格式的一般形式可表示为:% 附加字符 格式字符
格式字符 | 说明 |
d,i | 带符号的十进制输出整数 |
o | 八进制无符号输出整数 |
x、X | 十六进制无符号输出整数 |
u | 无符号十进制输出整数 |
c | 字符形式输出一个字符 |
s | 输出字符串 |
f | 小数形式输出实数 |
e、E | 指数形式输出实数 |
g、G | 用%f或%e格式中输出宽度较短的一种格式输出 |
字符 | 说明 |
l | 长整型整数,可加在d、o、x、u前边 |
m(代表一个正整数) | 数据最小宽度 |
n(代表一个正整数) | 对实数,表示输出n位小数;对字符串,表示截取字符个数 |
- | 输出数字或字符在域内向左靠 |
4.3 用scanf函数输出数据
scanf函数一般形式
scanf(格式控制,地址列表),地址列表是个变量地址用取地址符或指针,而不是直接使用变量名。
格式控制符同printf输出函数类似。
4.4 字符输入输出函数
1. putchar函数输出函数,向显示器输出一个字符。
2. getchar函数输入一个字符,向计算机输入一个字符。