,liux_yt ,第2章 基本数据类型、运算符与表达式,*,管理学院信息管理教研室,程序设计基础,-C语言程序设计教程(第二版),学习的意义,学习,C,语言的目的是什么?,目的可能是为了:,期末考试,等级考试,研究生考试,程序员考试,最终目的是:,用C语言编写,程序,来解决实际问题!,程 序,是什么?,程序是解决某种问题的一组指令的有序集合。,著名计算机科学家沃思(,Nikiklaus,Wirth,)提出一个公式:,程序,=,数据结构,+,算法,学习的意义,程序是什么?,对数据的描述。,在C语言中,体现为,数据类型,的描述!,对数据处理的描述。,是为解决一个问题而采取的方法和步骤,是程序的灵魂!,结论:学好C语言首先就必须十分了解C语言的数据类型、运算符与表达式。,掌握变量和常量的概念;,掌握各种类型数据的常量的使用方法;,掌握整型、字符型、浮点型变量的定义,和,引用方法;,掌握赋值运算符、算术运算符、逗号运算符等的使用方法;,理解运算符的优先级和结合性的概念,记住所学的各种运算符的优先级关系和结合性。,学习目标,2.1 C语言的数据类型,2.2 常量、变量与标识符,2.3 简单数据类型与表示范围,2.4 运算符与表达式,2.5 运算符的优先级与结合性,学习目标,C,数,据,类,型,基本类型,构造类型,指针类型,空类型void,定义类型typedef,字符类型char,枚举类型enum,整型,实型,单精度型float,双精度型double,数组,结构体struct,共用体union,短整型short,长整型long,整型int,数据类型决定:,1.数据占内存字节数,2.数据取值范围,3.其上可进行的操作,本章所介绍的数据类型,2.1 C语言数据类型,2.2,常量、变量和标识符,1.标识符,定义:,用来标识变量、常量、函数等的字符序列,组成,:,只能由,字母,、,数字,、,下划线,组成,且第一个字母必须是字母或下划线,C语言的关键字不能用作变量名,大小写敏感,长度,:有效长度为32个字符。随系统而异,但至少前8个字符有效,命名原则:,变量名和函数名中的英文字母一般用小写,以增加可读性,见名知意,不宜混淆 如,l,与,I,o,与0,在TC2.0及BC3.1中,变量名(标识符)的有效长度为32个字符,缺省值为32,但在VC中其长度可达到255,例:判断下列标识符号合法性,sum Sum M.D.John day Date 3days,student_name#33 lotus_1_2_3,char ab _above$123,3days,#33,char,$123,ab,.,字符非法,数字3不可作首字符,#,字符非法,char是关键字,字符非法,$不可作首字符,2.2,常量、变量和标识符,2.常量,定义:,程序运行时其值不能改变的量(即常数),常量的分类,:,直接常量,(,值常量,),整型常量,:,10,、,15,、,-10,、,-30,实型常量:,12.5,、,30.0,、,-1.5,字符常量,:,A,、,b,、,c,字符串常量,:,“sum”,、“,A”,、“,123”,符号常量,用标识符来代表常量。,其定义格式为:,#,define 符号常量 常量,#define NUM 20,#define PI 3.1415926,#include ,#define PRICE 30,void main(),int num,total;,num=10;,total=num*,PRICE,;,printf(total=%d,total);,运行结果:total=300,行尾不能有分号,define,前面一定要有,#,符号常量名最好使用大写,符号常量名最好有意义,2.2,常量、变量和标识符,3.变量,定义:,程序运行时其值可以被改变的量,变量的两要素:,变量名、变量值,变量的定义格式:,变量的初始化:,定义时赋初始值,变量的使用:,先定义,后赋值,变量定义位置:,一般,放在函数开头,数据类型 变量名1,变量名2,变量名n;,int x,y,z;,float radius,length,area;,char ch;,决定分配字节数,和数的表示范围,合法标识符,例:,int a=2,b,c=4;,float data=3.67;,char ch=A;,int x=1,y=1,z=1;,int x=y=z=1;,编译程序根据变量定义为其,分配指定字节的内存单元,地址,sh,ort int a=1,b=-3,c;,a,b,c,2字节,2字节,2字节,地址,地址,内存,.,.,1,-3,随机数,例1:,int student;,stadent=19;/,Undefined symbol statent in function main,例2:,float a,b,c;,c=a%b;/,Illegal use of floating point in function main,void main(),int a,b=2;,float data;,a=1;,data=(a+b)*1.2;,printf(“data=%fn”,data);,变量定义,可执行语句,void main(),int a,b=2;,a=1;,float data;,data=(a+b)*1.2;,printf(“data=%fn”,data);,T:以下哪个不是C语言中定义的关键字(),A)int B)sizeof C)flag D)default,1.整型数据,整型常量,十进制整数:,由数字,0,9,和正负号表示,。,如,:123,-456,0,八进制整数:由数字,0,开头,后跟数字,0,7,表示。,如,:0123,011,十六进制整数:由,0 x,或,0X,开头,后跟,0,9,a,f,,,A,F,表示。,如,0 x123,0Xff,定义整数的符号常量,#define NUM1 20 /十进制数20,#define NUM2 020 /八进制数(十进制16),#define NUM3 0 x2a /十六进制数(十进制42),思考题:下列整型常量哪些是非法的?,012,oX7A,00,078,0 x5Ac,-0 xFFFF,0034,7B。,首字符不能是字母o,八进制数中不能有数字8,十进制数中不能有字母B,2.3 简单数据类型与表示范围,2.整数在内存中的表示,整数的数值在内存中用补码的形式存放。,求一个整数补码的方法:,(1)一个正数的补码和其原码的形式相同。,(2)求负数的补码的方法是:将该数的绝对值的二进制形式,按位取反再加1。,2.3 简单数据类型与表示范围,2.整数在内存中的表示,十进制整数,14:,对于,16,位的内存单元,:,符号位(表示正),00001110,0,0000000,低字节,高字节,低地址,高地址,符号位,十进制数+14两个字节的内存实际存放形式,(+14),补,=,0,000 0000 0000 1110,2.整数在内存中的表示,十进制整数,14:,对于,32,位的内存单元,:,符号位(表示正),低字节,高字节,低地址,高地址,十进制数+14四个字节的内存实际存放形式,(+14),补,=,0,000 0000 0000 0000 0000 0000 0000 1110,00001110,00000000,00000000,0,0000000,符号位,记住:,数据在内存中的存放位置是高字节放在高地址的存储单元中,低字节放在低地址的存储单元中,。,2.整数在内存中的表示,十进制整数,14:,对于,16,位的内存单元,:,符号位(表示负),11110010,1,1111111,低字节,高字节,低地址,高地址,符号位,十进制数-14两个字节的内存实际存放形式,(+14),补,=,0,000 0000 0000 1110,(-14),补,=,1,111 1111 1111 0010,按位求反,末位加1,2.整数在内存中的表示,十进制整数,14:,对于,32,位的内存单元,:,符号位(表示负),低字节,高字节,低地址,高地址,十进制数-14四个字节的内存实际存放形式,(+14),补,=,0,000 0000 0000 0000 0000 0000 0000 1110,11110010,11111111,11111111,1,1111111,符号位,(-14),补,=,1,111 1111 1111 1111 1111 1111 1111 0010,按位求反,末位加1,2.整数在内存中的表示,十进制整数,65537:,对于,16,位的内存单元,:,符号位(表示负),(+65537),补,=,0,1 0000 0000 0000 0001,(-65537),补,=,1,0 1111 1111 1111 1111,按位求反,末位加1,11111111,1,1111111,低地址,高地址,十进制数-65537两个字节的内存实际存放形式,低字节,高字节,符号位,取低16位,真值为:-1,不是-65537!,2.整数在内存中的表示,十进制整数,65537:,对于,32,位的内存单元,:,符号位(表示负),低字节,高字节,低地址,高地址,十进制数-65537四个字节的内存实际存放形式,(+65537),补,=,0,000 0000 0000 0001 0000 0000 0000 0001,11111111,11111111,11111110,1,1111111,符号位,表示负,(-65537),补,=,1,111 1111 1111 1110 1111 1111 1111 1111,按位求反,末位加1,真值为:,-65537!,为什么-65537这个数在16位内存单元中的表示与在32位内存单元中的表示不相同呢?,这主要是因为,-65537这个数超出了16位内存单元表示数的范围,,所以实际存储的值(-1)与要表示的值(-65537)不同,但-32767并没有超出了32位内存单元表示数的范围,所以实际存储的值就是其本身。因此,在C语言中对数据处理时必须要注意数据的表示范围,以免引起不必要的错误,。,3.整型变量,整型变量的定义,int 变量名,变量名2,变量名n;,int必须小写,至少一个空格,必须为合法的标识符,以逗号,分隔,以分号;结尾,定义时可以赋初值,方法:在变量名后面增加“=数值”,例:,int a;,int x,y,z;,int m=2,y=-3;,当程序中定义了一个变量时,计算机会为这个变量分配一个相应大小的内存单元。因此,这个变量是有值的,它的值就是对应内存单元的值。如果定义时没有赋初值,则这个值程序员是无法预知的。,整型变量的分类,修饰符,控制变量是否有符号:,signed,(有符号)和,unsigned,(无符号),控制整型变量的值域范围:,short,(短)和,long,(长)。,有符号基本型(,int,),int,a=-2;,/,定义一个有符号整型变量,a,,并赋初值,-2,占一个机器字大小的内存单元。,TC,或,BC3.1,下,变量占,2,个字节(,16,位)的内存单元;,VC6.0,下,变量占,4,个字节(,32,位)的内存单元。,如果定义变量时,不指定signed,也不指定unsigned,则默认为signed(有符号),11111110,1,1111111,低地址,高地址,低字节,高字节,符号位,变量a占用的内存单元(2字节),有符号整型变量在内存中的实际存放形式(假设在BC3.1下),无符号基本型(,unsigned,int,或,unsigned,),unsigned int a=2;,/定义一个无符号整型变量a,并赋初值2,或,unsigned a=2;,占用的内存单元字节数同int类型。与int a=2;等价。,unsigned int a=-2;,/定义一个无符号整型变量a,并赋初值-2,或,unsigned a=-2;,11111110,1,1111111,无符号整型变量在内存中的实际存放形式(假设在BC3.1下),