第三章:最简单的C程序设计–>顺序程序设计
二进制运算
0+0=0;0+1=1;1+0=1;1+1=10
1-1=0;1-0=1;0-0=0;0-1=1
进制转换
- 二进制:0、1;数字前面加0;逢2进1
- 八进制:0~7;逢8进1
- 十进制:0~9;数字前面加0x;逢10进1
- 十六进制:09、AF;逢16进1
10转N进制
转10进制
3.2-数据的表现形式及其运算
常量
-
整型常量
-
浮点型常量(实数)
- 小数形式,如123.456、345. 、 .123
- 指数形式,如123.456=123.456e0=12.3456e1=1.23456e2
-
字符常量
- 用单引号包含的单个字符(英文大小写字母、数字字符、特殊字符)
- 转义字符:以字符反斜线(\)开头的字符序列。
-
字符串常量
-
一对双引号括起来的字符序列。
‘x'与“x"在c语言中意义不同
-
符号常量
- 用一个标识符代表一个常量,即标识符形式的常量,称为符号常量。
- 符号常量的值在其作用域内不能改变,也不能被再赋值,这与变量不同。习惯上,符号常量用大写字母,变量名用小写字母加以区别。
变量
- C语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。变量名是标识符的一种。
- 第一个字符不能是数字,只能由数字、字母、下划线构成
- 不能与关键字同名
- 区分大小写
数据类型
3.2-整型数据
原码、反码、补码
一个字节(8位)位例:
最高位为符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制。
正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变
正数的补码与原码一致,负数的补码是该数的反码加1
整数数据的存储
- C语言中,整数在内存中是以__补码方式__存放
- 正数的补码就是其原码(二进制形式)
- 负数的补码是其绝对值的原码取反加一
- 一个短整型分配两个字节,因此有符号变量的值的范围为:-32768-32767;无符号变量的值的范围为:0-65535,如果超出这个范围就发生数据溢出.
- c语言中,系统对于数据溢出不会给出出错信息,要仔细考虑,以防止出错.
- 两个字节(16位)、四个字节(32位)、八个字节(64位)
- 有符号整数存储单元中最高位代表数值的符号(0为正,1为负);如果是unsigned型,存储单元中全部二进制都用作存放数值本身,而没有符号。因此不能存放负数。
short a; //a为有符号短整型变量;变量范围:-32768~32767
unsigned short b; //b为无符号短整型变量,范围要小一点;变量范围:0~65535
注意:
1.只有整型和字符型数据可以加signed或unsigned修饰符,实型(浮点类型)数据不能加
2.对无符号整型数据用"%u"格式输出. %u表示用无符号十进制数的格式输出
字符型数据
字符与字符代码
- 只能使用系统字符集中的字符,目前多采用ASCII字符集
- 包括英文大小写字母(严格区分大小写)、数字字符、空格符、专门符号、不能显示的字符(控制字符):空字符(‘\0’表示)、警告(’\a’)、退格(‘\b’)、回车(‘\r’)
字符变量
- 定义关键字:
char
- 字符变量实质上是一个字节的整型变量,常用来存放字符,注意__只能放一个字符.__
eg:
char c1 = 'A',c2 = 97
%d表示格式输出十进制整数; %c格式输出字符
字符型数据的存储空间和取值范围
[signed] char 字节数为1 取值范围:-128~127,即-2**7~(2**7-1)
unsigned char 字节数为1 取值范围:0~255,即0~(2**8-1)
注意:
字符’1’与1是不同的概念.字符’1’只代表形状为’1’的符号,输出时按原样输出,在内存中以ASCII码形式存储,占一个字节;而整数1是以整数存储方式(二进制补码方式)存储的,占2个或4个字节.
浮点型数据
浮点型常量的表示方法
123.456=123.456e0=12.3456e1=1.23456e2
=0.123456e3=0.0123456e4
? =0.00123456e5=……
其中的1.23456e2称为“规范化的指数形式”
注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数
- C编译系统把浮点型常量都按双精度处理,分配8个字节
浮点型变量
浮点型数据在内存中存放形式
- 小数在内存中以浮点数的形式存储,浮点数是数字(或者说数值)在内存中的一种存储格式,与定点数相对
- 浮点型数据在内存中是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放
- 浮点数不一定能保存真实的小数,很有可能保存的是一个近似值
3.3-C的运算符
运算符顺序(重要)
常用算术运算符
- “+”
- “-”
- “*”
- “/”
- 整数相除为整数:5/3=1;-5/3=-1或-2
- 舍入方向不确定,一般向0方向:3/5=0
- “%”
- 两侧均应为整数数据
- 取余的结果只与被除数的符号有关,与除数符号无关;5%-3=2;-5%-3=-2
注意:
若参加运算+,-,*,/运算的两个数中有一个数是实数,结果为double型,因为所有的实数都是按double型计算的
自增(++),自减(–)运算符
- C语言中,简化为++,–,作用是使变量的值增1或减1
- 前置运算(++放在前面)
++i, 先执行i=i+1,再使用i的值
i++, 先使用i值,再执行i=i+1
自增,自减运算符只能用于变量
- 应用:
- 循环语句,使得循环变量的值自动+1
- 指针变量,使得指针指向下一地址
数据类型间的自动转换与强制转换
自动类型转换
- 自动类型转换是编译器默默地进行的数据类型转换,这种类型不需要程序员干预,会自动发生.
- 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换(向左看齐,转换为赋值运算符左侧的类型)
- 在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算(向长看齐,转换按数据长度增加的方向进行)
- 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算
- 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算
- char 和 short 参与运算时,必须先转换成 int 类型
强制类型转换
- 强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换
- 格式:
临时性
- 无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值
3.4-C语句
3.5数据的输出与输入
用printf函数输出数据
- 按格式控制字符串规定的格式,向指定的输出设备输出在输出表列中列出各输出项
- 一般格式:
printf(格式控制字符串,输出表列)
- 格式控制字符串由普通字符和格式说明两部分组成
- 普通字符:执行时按照原样输出,一般起提示作用
- 格式说明:以%开头的字符串,即:%格式符
- "%[修饰符]格式字符"用来说明输出数据的类型、形式、宽度、小数位。
printf函数中用到的格式字符
printf()高级用法
- 要输出一个 3×3 的整数矩阵,为了增强阅读性,数字要对齐:
#include <stdio.h>
int main()
{
int a1=12, a2=3456, a3=7001;
int b1=56720, b2=99995, b3=20098;
int c1=233, c2=2055, c3=23006783;
printf("%-9d %-9d %-9d\n", a1, a2, a3);
printf("%-9d %-9d %-9d\n", b1, b2, b3);
printf("%-9d %-9d %-9d\n", c1, c2, c3);
return 0;
}
putchar()字符输出函数
putchar(c); //c可为char型或int型
putchar('\n') ; // 换行
putchar('\121'); // Q
输入数据
- 在C语言中,有多个函数可以从键盘获得用户输入
- scanf():与 printf() 类似,scanf() 可以输入多种类型的数据
- getchar()、getche()、getch():这三个函数都用于输入单个字符
- gets():获取一行数据,并作为字符串处理
格式化输入函数scanf()
- 功能:按照格式控制字符串规定的格式,从指定的输入设备上读数据到指定的变量中
- 一般格式:scanf(格式控制字符串,地址列表)
- 说明:
- unsigned型数据,可用%u、%d、%o、%x输入
- 格式控制字符串中的普通字符照原样输入.即scanf(“%d,%d,%d”,&a,&b,&c)以,隔开,输入时也要用逗号隔开
- 若格式控制字符串中没有普通字符作输入数据间的间隔,也没有指定域宽时,对于整数和浮点数,可用空格、制表符或回车键作为间隔
getchar()字符输入函数
- 功能:从终端输入一个字符
- 一般形式:getchar()
- 函数值:从输入设备得到的字符
- 说明:getchar()只能接受一个字符,该字符可以赋给一个char型或者int型变量