440 likes | 565 Views
第三章 数据类型、运算符与表达式. 整型 int. 3.1 C 的数据类型. 整型. 长整型 long. 字符型 char. 单精度型 float. 基本类型. 实型(浮点型). 双精度型 double. 枚举类型. 数组类型. 数据类型. 构造类型. 结构体类型. 共用体类型. 指针类型. 空类型. 3.2 常量与变量. 3.2.1 常量与符号常量 1. 常量的概念 在程序运行过程中,其值不能被改变的量称为常量。 2. 常量的分类 ( 1 )整型常量 ( 2 )实型常量 ( 3 )字符常量。 ( 4 )符号常量。
E N D
第三章 数据类型、运算符与表达式 整型int 3.1C的数据类型 整型 长整型long 字符型char 单精度型float 基本类型 实型(浮点型) 双精度型double 枚举类型 数组类型 数据类型 构造类型 结构体类型 共用体类型 指针类型 空类型
3.2 常量与变量 3.2.1 常量与符号常量1.常量的概念 在程序运行过程中,其值不能被改变的量称为常量。2.常量的分类 (1)整型常量 (2)实型常量 (3)字符常量。 (4)符号常量。 常量的类型,可通过书写形式来判别。 3. 符号常量:有时为了使程序更加清晰和便于修改,用一个标识符来代表常量,即给某个常量取个有意义的名字,这种常量称为符号常量。 #define PI 3.1416 使用符号常量的好处: ( 1)含义清楚、见名知意。 ( 2)修改方便、一改全改。
#define PI 3.14 #include<stdio.h> void main() { float area; area=10*10*PI; printf("area=%f\n",area); } 结果:area=314.000000
例3.1 符号常量的使用 #define PRICE 30 #include<stdio.h> void main() { int num,total; num=10; total=num*PRICE; printf("\ntotal=%d",total); }
3.2.2 变量 1.变量的概念 在程序运行过程中,其值可以被改变的量称为变量。 2.变量的两个要素 (1)变量名。每个变量都必须有一个名字──变量名,变量命名遵循标识符命名规则。 (2)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。
3.标识符命名规则 (1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。 (2)有效长度:随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。 例如,由于student_name和student_number的前8个字符相同,有的系统认为这两个变量,是一回事而不加区别。 在TC V2.0中,变量名(标识符)的有效长度为1~32个字符,缺省值为32。
(3)C语言的关键字不能用作变量名。 注意:C语言对英文字母的大小敏感,即同一字母的大小写,被认为是两个不同的字符。 习惯上,变量名和函数名中的英文字母用小写,以增加可读性。 思考题:在C语言中,变量名total与变量名TOTAL、ToTaL、tOtAl等是同一个变量吗? 标识符命名的良好习惯──见名知意: 所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。 例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。
变量的地址:变量在内存中占据相应字节的存储空间变量的地址:变量在内存中占据相应字节的存储空间 该存储空间的首地址即为变量的地址,变量a的地址用 &a表示 变量的声明:变量在使用前必须先声明,其声明格式为 类型标识符 变量名; 变量的赋值: 变量名=表达式 没有赋值的变量其值是不确定的
3.3 整型数据 3.3.1整型常量的表示方法 八进制整数:以数字0开头的八进制数。如:0127 十六进制数:以0x开头的十六进制数.如:0x2f 长整型:后面加l或L。如:12L 无符号整型:后面加U或u 3.3.2 整型变量 1,整型数据在内存中的存放形式:以二进制补码的形式存放 补码:正数的补码与原码相同,负数的补码为除符号位(最高位)外,其余各位取反后加1
10的二进制表示为:1010 10的存放形式为:00000000 00001010 -10的存放形式为:10的存放形式按位取再反加1,即:11111111 11110101+1= 11111111 11110110
例:求1234和-1234的存放形式 1234=1024+210=1024+128+64+16+2 =1×210+ 0×29 + 0×28 + 1×27 + 1×26 + 0×25 + 1×24 + 0×23 + 0×22 + 1×21 + 0×20 =10011010010B=0000 0100 1101 0010B -1234的存放形式为: 1111 1011 0010 1101+1=1111 1011 0010 1110
2. 整型变量的分类 根据占用内存字节数的不同,整型变量又分为4类: (1)基本整型(类型关键字为int)。 (2)短整型(类型关键字为short) (2)长整型(类型关键字为long [int])。 又分为无符号整型(unsigned)与有符号整型(默认类型)。无符号型:最高位仍用来存放数据 整型变量所占存放空间:short≤int≤long Turbo C中分别为:2,2,4 Visual C++中分别为:2,4,4 3. 整型变量的定义 int a,b; long c; unsigned d;
#include<stdio.h> void main(){ short i=65538; int j=-1234; long k=65538; printf("%d,%d,%d",sizeof(short),sizeof(int),sizeof(long)); printf("\n%d,%u,%ld\n",i,j,k); } Visual C++中的运行结果为: 2,4,4 2,4294966062,65538
例3.2 整型变量的定义与使用 #include<stdio.h> void main() {int a,b,c,d; unsigned u; a=12;b=-24;u=10; c=a+u;d=b+u; printf("a+u=%d,b+u=%d\n",c,d); }
4. 整型数据的溢出:注意各种类型变量的取值范围4. 整型数据的溢出:注意各种类型变量的取值范围 例3.3 整型数据的溢出 main() {int a,b; a=32767; b=a+1; printf("%d,%d",a,b); } 32767=215-1=(0111 1111 1111 1111)B 32768= 215=(1000 0000 0000 0000)B -32768的补码为: (0111 1111 1111 1111)B+1
3.4 实型数据 3.4.1,实型常量的表示方法实型常量即实数,在C语言中又称浮点数,其值有两种表达形式:(1)十进制形式。例如3.14、9.8。 (2)指数形式:<尾数>E(e)<整型指数>。例如3.0E+5等。3.4.2 浮点型变量 1。实型数据在内存中的存放形式 一个实数在内存中占4个字节(一个字节为8个二进制位),其存放形式为:用一个部分位如24位存放小数,用其余位存放指数部分。如3.14159,小数部分为0.314159,指数部分为1
2。实型变量的分类 float x,y; double z;
3,实型数据的舍入误差 在计算机中实型数据并不是总能准确表示。如float型数据只有6-7位是有效的。 例3.4:实型数据的舍入误差 #include<stdio.h> void main(){ float a,b; a=123455.789e5; b=a+20; printf("a=%f,b=%f",a,b); } 运行结果为:a=12345578496.000000,b=12345578516.000000
3.4.3 实型常量的类型 许多系统将实型常量作为双精度型数据进行运算,然后再将结果取7位有效数字。 若在实型常量后面加一个f,则此常量不会转换成双精型常量。 如:1.65f,654.321f
3.5 字符型数据 3.5.1 字符常量 1.字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。 2.转义字符 C语言还允许使用一种特殊形式的字符常量,就是以反斜杠“\ ”开头的转义字符 注意:如果反斜杠或单引号本身作为字符常量,必须使用转义字符:‘\\’、‘\’‘。
例3.5 转义字符的使用 #include<stdio.h> void main() { printf(" ab c\t de\rf\tg\n"); printf("h\ti\bj k\n") printf("\tY\b="); } \t:制表区占8列 a在第2列输出d在第10列输出
3.5.2 字符变量 字符变量的类型关键字为char,一般占用1字节内存单元 字符变量的定义格式:char 字符变量名表; 如:char c1,c2; 字符变量的赋值:字符变量名=字符常量; 或:字符变量名=正整数; 如:c1='a';c2=97;c1='\103'; 变量的输出:printf("%c",c1);
3.5.3 字符数据在内存中的存储形式及使用方法 字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。如 c1='A'的存储方法为:01000001 字符型数据可以以字符型(%c)格式输出字符或整型格式(%d)输出其ASCII码。字符型数据可以进行算术运算。
例3.6 向字符变量赋以整数 #include<stdio.h> void main() {char c1,c2; c1=97;c2=98; printf("%c %c\n",c1,c2); printf("%d %d\n",c1,c2); } #include<stdio.h> void main() {char c1,c2; c1='a';c2='b'; printf("%c %c\n",c1,c2); printf("%d %d\n",c1,c2); } 输出结果:a b 97 98
例3.7 大小写字母的转换 #include<stdio.h> void main(){ char c1,c2; c1='a';c2='B'; c1=c1-32;c2=c2+32; printf("%c%c",c1,c2); } 输出结果为:Ab
3.5.4 字符串常量 1.字符串常量的概念和字符串长度 字符串常量是用一对双引号括起来的若干字符序列。 字符串中字符的个数称为字符串长度。长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为"" (一对紧连的双引号) 例如,"How do you do."、"Good morning."等,都是字符串常量,其长度分别为14和13(空格也是一个字符)。 如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。 例如:(1)C:\msdos\v6.22 → "C:\\msdos\\v6.22"(2)I say:"Goodbye!" → "I say:\"Goodbye!\""
2.字符串的存储 C语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个‘\0’作为字符串的结束标志。 注意:在源程序中书写字符串常量时,不必加结束字符‘\0’,否则画蛇添足。 如果有一个字符串为“CHINA”,则它在内存中的实际存储如下所示: 最后一个字符'\0'是系统自动加上的,它占用6字节而非5字节内存空间。
字符常量'A'与字符串常量"A"的区别: (1)定界符不同:字符常量使用单引号,而字符串常量使用双引号; (2)长度不同:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数; (3)存储要求不同:字符常量存储的是字符的ASCII码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志’\0’。
3.6 变量赋初值 没有赋值的变量其值是不确定的 变量赋值的格式为: 变量名=表达式 如:a=4;b=5;c='a'; 变量的初始化:定义的同时赋值。如 int a=65,b; char c1='d';
3.7 各类数值型数据间的混合运算 当两个不同类型数据间进行运算时,系统会自动将较低的数据类型转换成较高的数据类型 低------------->高 char->int->unsigned->long->float->double 例:求下列表达式的值: 7/2 7.0/2 7.0/2.0 7/2*2
3.8 算术运算符和算术表达式 3.8.1C运算符简介:包括13类 1.算术运算:+ - * / % 2.关系运算:>, <, >=, <=, ==, != 3.逻辑运算:!, &&, || 4.位运算:<<, >>, ~,| ^ & 5.赋值运算符:=及其扩展运算符如+=等 6.条件运算符:? : 7.逗号运算符:, 8.指针运算符:*,& 9.求字节运算符:sizeof 10.强制类型转换:(类型) 11.分量运算符:. -> 12.下标运算符:[] 13.其它( )
3.8.2 算术运算符和算术表达式 1. 基本算术运算符+、-(减法/取负)、*、/、%(求余数) (1)关于除法运算/ C语言规定:两个整数相除,其商为整数,小数点和小数部分被舍弃。例如,5 / 2 = 2。-5/2=-2(2)关于求余数运算% 要求两侧的操作数均为整型数据,否则出错。 (3)如果参加+,-,*,/运算的两个数中有一个实数,则结果是double型。
2. 算术表达式和运算符的优先级与结合性 (1)表达式的概念 用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合C语言语法规则的式子,称为表达式 (2)算术表达式的概念 表达式中的运算符都是算术运算符。 例如,3 + 6 * 9、(x + y) / 2 - 1等,都是算术表达式
(3)运算符的优先级与结合性 1)C语言规定了运算符的优先级和结合性。 所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。 结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。
2)表达式求值 • 按运算符的优先级高低次序执行。例如,先乘除后加减。 • 如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。 例如,算术运算符的结合方向是“自左至右”,即:在执行“a – b + c”时,变量b先与减号结合,执行“a - b”;然后再执行加c的运算。
3,强制类型转换运算符 数据类型强制转换的一般格式为: (要转换成的数据类型)(被转换的表达式) 当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。 例如, (double)a(等价于(double)(a)) //将变量a的值转换成double型 (int)(x + y) //将x+y的结果转换成int型 (float)5/2 //(等价于(float)(5)/2) (float)(5/2) //将5整除2的结果(2)转换成实型(2.0) 注意:强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。例如,(double)a 只是将变量a的值转换成一个double型的中间量,其数据类型并未转换成double型。
4. 自增、自减算术运算 i++,++i i=i+1 i--,--i i=i-1 其中i必须为整型变量,不能是表达式或常量 ++i与--i为前缀运算,若表达式中有前缀运算则应先 对变量进行自加减,然后用新的变量值代入表达式中 i++与i--为后缀运算,若表达式中有后缀运算则应先 用新的变量值代入表达式中,然后对变量进行自加减,
例如 int i=5; y=++i; 又如 int i=5; y=i++; 又如 int i=5; y=(++i)+ (++i)+(++i); 相当于 ++i;++i;++i; y=i+i+i; /*y=24*/ 又如 int i=5; y=(i++)+ (i++)+(i++); 相当于 y=i+i+i; i++;i++;i++;
#include<stdio.h> void main(void) {int m,n; m=8;n=10; printf("%d,%d,%d,5d",m,n,m++,n++); }
3.9 赋值运算与赋值表达式 1.赋值运算 赋值符号“=”就是赋值运算符,它的作用是将一个表达式的值赋给一个变量。 赋值运算符的一般形式为: 变量 = 赋值表达式 例如,x = 5 y = (float)5 / 2 如果表达式值的类型,与被赋值变量的类型不一致,但都是数值型或字符型时,系统自动地将表达式的值转换成被赋值变量的数据类型,然后再赋值给变量。 思考题:假设变量num的数据类型为float,其值为2.5,则执行“num = (int)num”后,num的值等于多少?
3. 复合赋值运算符 一般形式: 变量 双目运算符 = 表达式 └──┬──┘ 复合赋值运算符 它等价于:变量 = 变量 双目运算符 (表达式)。 a+=b a=a+b a-=b a=a-b a*=b a=a*b a/=b a=a/b a%=b a=a%b
3.10 逗号运算符和逗号表达式 C语言提供一种用逗号运算符“,”连接起来的式子,称为逗号表达式。逗号运算符又称顺序求值运算符。 1.一般形式 表达式1, 表达式2, ……, 表达式n 2.求解过程 自左至右,依次计算各表达式的值,“表达式n”的值即为整个逗号表达式的值。 例如,逗号表达式“a = 3 * 5, a * 4”的值=60:先求解a = 3 * 5,得a=15;再求a * 4 = 60,所以逗号表达式的值=60。 又例如,逗号表达式“(a = 3 * 5, a * 4), a + 5”的值=20:先求解a = 3 * 5,得a=15;再求a * 4=60;最后求解a + 5=20,所以逗号表达式的值=20。 注意:并不是任何地方出现的逗号,都是逗号运算符。很多情况下,逗号仅用作分隔符。
作业 3.3,3.4,3.6,3.7, 3.9 3.10 3.12