C语言程序设计数据类型、运算符和表达式一、C语言的数据类型二、C语言的变量和常量2.1常量和符号常量1、常量:在程序运行过程中,其值不能被改变的量。每种数据类型都有常量,也都有变量。如整型常量、浮点型常量.例如:12、4、-67或3.145.6或'a'、'd‘从上可以看出常量可以是不同类型的.2、常量分为两种直接常量和符号常量。直接常量直将数值直接使用,如:a=b*10;当用一个标志符代表一个常量时,称为符号常量.2.1常量和符号常量1、常量:在程序运行过程中,其值不能被改变的量。每种数据类型都有常量,也都有变量。如整型常量、浮点型常量.例如:12、4、-67或3.145.6或'a'、'd‘从上可以看出常量可以是不同类型的.2、常量分为两种直接常量和符号常量。直接常量直将数值直接使用,如:a=b*10;当用一个标志符代表一个常量时,称为符号常量.上例中的PRICE就称为符号常量;凡在程序中出现的PRICE都代表30。PRICE=PRICE+5;/*正确否*/一般情况下,符号常量名用大写、变量用小写。例:#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf(total=%d,total);}3、符号常量的声明和使用一般放在程序的前端,与#include…在一块:#define符号常量名值如:#defineZero0好处:含义清楚(#defineSecond60)一改全改(#definePI3.14)2.2变量在程序运行过程中,其值可以改变的量称为变量。一个变量应该有一个变量名,并且在内存中占据一定的的存储单元用来存放变量的值。注意:变量名与变量值的区别在C语言中,要求对所有用到的变量作强制定义,即“先定义、后使用”。因为:1、编译程序不能翻译未定义变量。2、编译程序在编译时根据变量类型确定存储单元的数量并分配空间3、编译程序在编译时根据变量类型进行语法检查。例,整型变量a、b可以进行“求余”运算a%b;若把a、b定义为实数,则上述运算非法。main(){inti,studentNo;i=5;studentno=5;/*错在哪里*/j=3;/*错在哪里*/}一条变量说明语句由数据类型和其后的一个或多个变量名组成。变量说明的形式如下:类型变量表;这里类型是指TurboC2.0的有效数据类型。变量表是一个或多个标识符名,每个标识符之间用,分隔。例如:intiinti,j,k;charc,str[5],*p;所谓标识符是指常量、变量、语句标号以及用户自定义函数的名称。TurboC2.0标识符的定义十分灵活。作为标识符必须满足以下规则:1.所有标识符必须由一个字母(a~z,A~Z)或下划线(_)开头;2.标识符的其它部分可以用字母、下划线或数字(0~9)组成;3.大小写字母表示不同意义,即代表不同的标识符;4.标识符只有前32个字符有效(TurboC)5.标识符不能使用TurboC2.0的关键字。2.3标识符下面举出几个正确和不正确的标识符:正确-----------------不正确smart----------------5smart_decision------------bomb?key_board------------key.boardFLOAT----------------float三、整型数据整型常量即整常数按不同的进制区分,整型常数有三种表示方法:十进制数:以非0开始的数如:220,-560,45900八进制数:以0开始的数如:06;0106,05788十六进制数:以0X或0x开始的数如:0X0D,0XFF,0x4e3.1.整型常量main(){inti;i=11;printf(“i=%d\n”,i);i=011;printf(“i=%d\n”,i);i=0x11;printf(“i=%d\n”,i);i=0X11;printf(“i=%d\n”,i);}程序的输出结果是多少?注意:·可在整型常数后添加一个L或l字母表示该数为长整型数,如22L,0773L,0Xae4l。·另外,所有整数的缺省类型是int,可在整型常数后添加一个L或l字母表示该数为长整型数,如22L,0773L,0Xae4l。·若加上一个u或U字母表示该数为无符号整型数,如27u,0400u,0xb8000000u。·若加上一个ul或UL字母表示该数为无符号长整型数,如27ul,0400UL,0xb8000000UL。·当整数的值超出int类型所能表示的范围时称为整数溢出。1.整型变量的分类:加上不同的修饰符,整型变量有以下几种类型;C语言标准没有规定整型变量在计算机内存中所占的字节数,它与具体的机器和操作系统有关:3.2、整型变量2.整型变量的定义可以用下列语句定义整型变量:inta,b;/*a、b被定义为有符号短整型变量*/unsignedlongc;/*c被定义为无符号长整型变量*/unsignedshortc,d;/*指定变量c、d为无符号短整型*/longe,f;/*指定变量e、f为长整型*/程序中在函数的开头部分定义变量。main(){inta,b,c,d;/*指定变量a、b、c、d为整型*/unsignedu;/*指定变量u为无符号整型*/a=12;b=-24;u=10;c=a+u;d=b+u;printf(a+u=%d,b+u=%d\n,c,d);}程序运行显示:a+u=22,b+u=-143.整型变量的溢出main(){inti,j;unsignedk,l,m;i=32767;j=i+1;l=65535u;m=l+2;printf(j=%d\n,j);printf(l=%u\n,l);printf(m=%u\n,m);}象这类问题体现了C语言灵活性所带来的副作用。这种错误系统不给提示,由程序员自己控制。四、实型数据实数(real)又称为浮点数(float),有两种表达方式:普通(十进制)方式:0.123、.123、123.0、123.、0.0(必须有小数点)指数方式:123e3或123E3、123E-2注意:字母e(或E)之前必须有数字e后面指数必须为整数规范化指数形式:e前的小数部分中,小数点左边只能有一位非0数字。如下面例子应为:1.23e5错误:0.123e64.1实型常量4.2实型变量精确程度例:floatx,y;/*指定x、y为单精度实型变量*/doublez;/*指定z为双精度实型变量*/实型常量不分float和double。问题:如何用图示的方法表示这些变量的内存空间?4.3实型变量的误差与精度main(){floata,b;a=123456.789e5;b=a+20;printf(“%f\n”,a);printf(“%f\n”,b);}注意输出结果main(){floata;doubleb;a=111111.111;b=111111.111;printf(“%f\n”,a);printf(“%f\n”,b);}注意输出结果五、字符型数据用单引号(撇号)括起来的一个字符。如:'a'、'x'、'D'、'?'、'$'。注意,‘a’和‘A’是不同的字符常量。因为C语言区分大小写。以“\”开头的字符序列,称为“转义序列”。“\”使其后面的字符变为另外的意义。见下表。5.1字符常量转义序列主要用来控制打印机和屏幕输出。例:printf(\nsumis%d\n\n,sum);比较下面两句的区别:printf(“thisisa“test””);/*出错*/printf(“thisisa\“test\””);/*输出:thisisa“test”*/charc1,c2;/*定义c1、c2为字符变量*/c1='a';c2='b';字符变量在内存中占一字节。问题:如何用图示的方法表示这些变量的内存空间?5.2字符变量字符在内存中以ASCII码存放。5.3字符数据在内存中的存储形式及其使用方法main(){charc1,c2;c1=‘A’;c2=‘B’;printf(%c%c,c1+32,c2+32);}该例的输出是:abmain(){charc1,c2;c1='a';c2='b';c1=c1-32;c2=c2-32;printf(%c%c,c1,c2);}C语言允许字符和整数之间进行运算字符常量:单引号括起来的一个字符。字符串常量:双引号括起来的字符序列(0~N个字符)。如:Howdoyoudo.,CHINA,a,$123.45字符串常量在内存中的存放:每一个字符均以其ASCII码存放,且最后添加一个“空字符”(二进制00000000,记为NULL或\0。字符‘0’在内存中存0x30即00100000)。5.4字符串常量例:字符串常量“CHINA”存放在内存中的情况是:(6字节存储器空间,不是5字节)因此,字符'a'和字符串a的区别是:字符‘a’:1字节(值为97)字符串a:2字节(值为97,0)5.5字符与整型的相互转换main(){charc1,c2;c1=’a’;c2=’b’;printf(“c1=%c,c2=%c\n”,c1,c2);printf(“c1=%d,c2=%d\n”,c1,c2);}/*问题:结果如何*/六、变量赋初值为什么要给变量赋初值?(教室不打扫)因为分配的内存空间可能有一个脏数据。如果不赋初值,默认初始值就是这个脏数据。(举例说明)1.定义的同时给变量赋初值如:inta=3;floatb=3.1415;charc=‘x’;2.定义变量时,可以对其中的一部分变量赋初值.如:inta=3,b,c,d=8;3.把一个值赋给不同变量时,要分别进行。如不应写为:inta=b=c=3;而应写为:inta=3,b=3,c=3;4.初始化是在程序运行时,执行本函数时赋以初值的。即不是编译时赋以初值的。如:inta=3;相当于:inta;a=3;inta,b,c=5;相当于:inta,b,c;c=5;七、各类数值型数据间的混合运算在C语言中,整、实、字符型数据间可以混合运算,如:10+'a'+1.5-8765.1234*'b‘1、不同类型数据间进行运算时,要转换成同一类型转换过程中,低类型向高类型靠拢,然后进行运算,不同类型之间转换如下图所示,横向左箭头为必转,纵向箭头表示有条件类型转换。例:char数据在运算前必定转换为int数据;int数据可以转换为unsigned数据;float数据在运算前必定转换为double数据(即使两个float相加);int数据可以转换为double数据(若另外一个运算数据为double),(直接转换,不需先转换为unsigned,long,再转换为double)。上式的运算次序是:①进行10+'a'运算。先将'a'转换为整数97,运算结果为整数107。②进行i*f运算。先将i和f均转换为double类型(实运算过程总是使用double类型,仅在把结果存入存储器时,才可能使用float类型),运算结果是double类型。③整数107与i*f的积相加。先将整数107转换为double类型(107.0),运算结果是double类型。④进行d/e运算。先将longe转换为double类型,运算结果是double类型。⑤进行③-④运算,结果为double类型。八、算术运算符和算术表达式8.1C运算符简介8.2算术运算符和算术表达式1、基本的算术运算符+:加法或正值运算符,如:2+3、+5-:减法或负值运算符,如:8-3、-6*:乘法运算符,如:3*5/:除法运算符,则可以是整或实型数据。如5/3%:求余运算符,两侧必是整型数据。如7%4注:-5/3=-1(余-2)或-2(余+1),TurboC取-1结果(“向零取整”)。2、算术表达式和运算符的优先级与结合性算术表达式:如:a*b/c-1.5+’a’在C语言中,运算符共有15个优先级,其中算术运算符的优先级是:*、/、%(3级)+、-(4级)请见P375~376算术运算符的结合方向:从左向右注意:对于运算符的结合方向,只需记住三种运算符是自右向左的,其余都是自左