第三章数据类型、运算符与表达式_第1页
第三章数据类型、运算符与表达式_第2页
第三章数据类型、运算符与表达式_第3页
第三章数据类型、运算符与表达式_第4页
第三章数据类型、运算符与表达式_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2023/2/31中国石油大学计算机科学系C语言课件23.1C语言的字符集3.2C语言的数据类型3.3常量与变量3.4变量的定义与赋值3.5符号常量3.6运算符与表达式3.7各类型数据的混合运算3.8

不同类型赋值的结果

第3章数据类型、运算符与表达式

33.1

C语言的字符集3.1.1C语言字符集:1、字母:小写字母a~z、大写字母A~Z。2、数字:0~9共10个。3、空白符:空格符、制表符、换行符等。4、标点和特殊字符。5、字符常量,字符串常量和注释中还可以使用汉字或其它可表示的图形符号。字符是组成语言的最基本的元素。43.1.2

C语言词汇(六类)1、标识符:变量名、函数名、标号等。2、关键字:

关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。P365

(1)类型说明符:用于定义、说明变量、函数或其它数据结构的类型。

(2)语句定义符:用于表示一个语句的功能。

(3)预处理命令字:用于表示一个预处理命令。

标识符:由英文字母、数字和下划线这三种字符组成且第一个字符必须为字母或下划线。

作用:用来给变量、函数等命名

注意:

1.区分大小写英文字母

2.关键字(保留字)不能作标识符

例:book、Book、int1、Int、printf、_a12都可作标识符

5a、$、p#、int、x+y都不可作标识符函数名不是保留字保留字I大写3、运算符:运算符与变量,函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。4、分隔符

在C语言中采用的分隔符有逗号和空格两种。5、常量:

在后面章节中将专门给予介绍。6、注释符:

C语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。7其值不可以再分解为其它类型。用来表示某个变量在内存储器中的地址根据已定义的一个或多个数据类型用构造的方法来定义的。构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。3.2

C语言的数据类型8在调用函数值时,通常返回一个函数值,这个函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明。但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。其类型说明符为void。9

基本数据类型分为:

1、常量:在程序执行过程中,其值不发生改变的量

2、变量:其值可变的量称为变量。

在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用。3.3

常量与变量10直接常量(字面常量):n

整型常量:12、0、-3;n

实型常量:4.6、-1.23;n

字符常量:‘a’、‘b’。n

字符串常量:“ABC”、“123”。标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。符号常量:用标示符代表一个常量。在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。在使用之前必须先定义,#define

3.3.1

常量11一、整型常量:

1.十进制整数:123、-76、02.八进制整数:076、-0253076转换成十进制:7*8+63.十六制整数:0xa、0x20、0xf40xf4转换成十进制:15*16+4程序执行过程中值不发生改变的量

只有整数标识符号

常量12整型数据在内存中的存放形式:如果定义了一个整型变量i:

inti;i=10;十进制数10是以二进制形式表示的:1010,每一个整形变量在内存中占内2字节,存放示意图为:

事实上,数值是以补码表示的:

n

正数的补码和原码相同;

n

负数的补码:将该数的绝对值的二进制形式按位取反再加1。00000000000010101310的原码:取反:再加1,得-10的补码:由此可知,左面的第一位是表示符号的。000000000000101011111111111101011111111111110110例如:求-10的补码14二、实型常量(浮点型):也称为实数或者浮点数。实数只采用十进制,有二种形式:小数形式指数形式由数码0~9和小数点组成。小数形式必须有小数点。由十进制数、加阶码标志“e”或“E”、阶码(只能为整数,可以带符号)组成。其一般形式为:aEn(a为十进制数,n为十进制整数)其值为:

a*10n。

实型常数在内存中的存放形式15实型常量实例:

小数形式:12.、–.71、–0.71、3.14

指数形式:6.945e-8

注意:指数形式(科学表示法)中,尾数和阶码都不能省略、阶码只能为整型常量、只有十进制形式

6.945e–8尾数阶码6.945*10-8小数点不能省略

注:任一字符都可用’\ddd’或’\xhh’表示,其中ddd为该字符的ASCII码八进制形式、hh为该字符的ASCII码十六进制形式

例:’A’

、’\101’

、’\x41’均表示A

三、字符常量(一个字符)

两种表示方式:

1.在字符前后加单撇号:’y’

、’3’

、‘$’

2.用转义字符表示(P48表3.3):’\n’→换行’\r’→回车’\\’→\’\’’→’’\”’

表示”’\12’→换行’\15’→回车’\xa’→换行’\134’→\’\xd’→回车’\x5c’→\0-70-9a-f整型常量与转义字符不能混淆四、字符串常量:由两个双撇号括起来一串字符,其中字符个数>=0个字符串常量和字符常量区别:1)字符常量由单引号括起来,字符串常量由双引号括起来。字符常量只能是单个字符,字符串常量则可以含一个或多个字符。2)可以把一个字符常量赋予一个字符变量,不能把一个字符串常量赋予一个字符变量。3)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0"(ASCII码为0)。这是字符串结束的标志。18常量总结一、整型常量:二、实型常量:三、字符常量:四、字符串常量:十进制整数:10八进制整数:012十六制整数:0xa小数形式:0.123456指数形式:1.23456e-1ASCII码十进制:’\n’

’A’ASCII码八进制:’\12’

’\101’ASCII码十六制:’\xa’

’\x41’

以‘\0’结束。19字符串

“Cprogram”

在内存中所占的字节为:字符常量‘a’和字符串常量“a”在内存中的区别:‘a’在内存中占一个字节,可表示为:"a"在内存中占二个字节,可表示为:

Cprogram\0aa\001100001203:‘3’

“3”:-3:0000000000000011001100110000000000000011001100111111111111111101?\01111111111111100ASCII码值为(51)10→(110011)2例:-3、3、‘3’、“3”在内存中的存放形式‘3’是字符非数字1、计算字符串长度(其中字符个数)时要认真区分转义字符与一般字符如:”\x18\18qw+\168\1676”

中字符个数为?2、字符串存储到内存中所占的字节数为:字符个数+1

字符串常量可用转义字符表示

例:“ThisisaCprogram\n”

是字符串常量,它也可表示为:

”Thisisa\103\x20program\n”*若把字符串存储到内存中,系统会自动在其末尾加一个’\0’8*8+3=672*16=3210八进制0-722例1.main(){printf(”ab\tt\tpractice\tbook\n”);}结果ab

t

practice

book

’\n’——换行、’\r’——回车、

’\t’——水平跳到下一个tab位置

’\b’——退格、’\f’——换页8个字符91733*转义字符的使用例子

23例.voidmain()

{printf(”pencil\b\b\bxxx\n”);}

先显示pencil再退三格用xxx覆盖cil先打印pencil再重复打印xxx覆盖cil退格显示结果:penxxx打印结果:pencilxxx24

例.voidmain(){printf(”room”);printf(”pencil\n1234567890\r0\t1”);}显示结果:roompencil

0

10打印结果:roompencil

1234567890换行回车水平跳到下一个Tab位01先显示123456789025用标识符命名,习惯用小写

1、整型变量类型:

(1)[signed]int

(2)[signed]shortint(3)[signed]longint(4)unsigned[int](5)unsignedshort[int](6)unsignedlong[int]区别:①每个变量在内存中所占字节数②所能存放的数值范围3.3.2变量2字节16位4字节32位P43表3.1-32768~327670~65535各类整型量所分配的内存字节数及数的表示范围

以13为例:int型:shortint型:longint型:unsignedint型:unsignedshortint型:unsignedlongint型:0000000000001101000000000000110100000000000011010000000000001101000000000000000000000000000011010000000000000000000000000000110127整型数据的溢出voidmain(){inta,b;a=32767;b=a+1;printf("%d,%d\n",a,b);}32767:

01111111111111111000000000000000运行结果:32767,-32768-32768:

282、字符型变量类型:

*字符型变量是用来存放单个字符常量的ASCII码,不是字符本身。整型变量与字符型变量可混淆使用。例如:

chara,b;

(1)char

(2)unsignedchar区别:对变量值ASCII码的理解

char——

一个数的补码

unsignedchar——一个不带正负号的整数字符变量的类型说明符

字符数据在内存中的存储形式及使用方法

每个字符变量分配一个字节的内存空间,因此只能存放一个字符。字符值以ASCII码的形式存放。如:x的十进制ASCII码是120y的十进制ASCII码是121x:y:

允许对整型变量赋以字符值,或对字符变量赋以整型值。允许把字符变量按整型量输出,或把整型量按字符量输出。

整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。

0111100001111001120的二进制代码303、实型变量类型(1)float

(2)double*(3)longdouble

区别:①每个变量在内存中所占字节数

float—4、double—8②所能存放的数值范围

float10-38——1038double10-308——10308③有效数字位数float—7、double—1631实数3.14159在内存中的存放形式如下:

+.3141591数符指数小数部分占的位数愈多,数的有效数字愈多,精度愈高。占的位数愈多,能表示的数值范围愈大。32实型数据的舍入误差。voidmain(){floata,b;a=123456.789e5;b=a+20;

printf("%f\n",a);printf("%f\n",b);}运行结果:12345678848.00000012345678848.000000注意:1.0/3*3的结果并不等于1。大数加小数有效数字7位,前7位有效12345678900voidmain(){floata;doubleb;a=33333.33333;b=33333.33333333333333;printf("%f\n%f\n",a,b);}结果:33333.33203133333.333333

a是单精度浮点型,有效位数七位。整数已占五位,故小数二位之后均为无效数字b是双精度型,有效位为十六位。但TurboC小数后最多保留六位,其余部分四舍五入。34一、定义变量类型:

<类型名><变量表>;若变量表中含有多个变量,它们之间用逗号隔开。最后一个变量名之后必须以“;”号结尾

例:unsignedinti,j;或unsignedi,j;

3.4

变量定义与赋值一般所有变量都在声明部分定义类型二、给变量赋值

——把“=”右侧的值赋给“=”左侧的变量1、赋初值:定义变量类型时给变量赋值

在相应变量后写=<常量>例:inta=123,b=456,sum;2、赋值表达式:<变量>=<表达式>

赋值语句:<变量>=<表达式>;例:a=123sum=a+ba=123;sum=a+b;表达式末尾加“;”后即变成语句等价于inta,b,sum;a=123;b=456;①表达式本身有值的概念,其值同“=”左边变量相同;而语句本身无值的概念;②表达式是用来构成语句的。注:表达式中变量可用给该变量赋值的赋值表达式代替(应加圆括号)例:a=123;b=456;sum=a+b;可改为:sum=(a=123)+(b=456);注意:在定义中不允许连续赋值,如:

inta=b=c=5是不合法的而inta,b,c;

a=b=c=5则是合法的×√37

voidmain(){chara,b;a=120;b=121;printf("%c,%c\n",a,b);printf("%d,%d\n",a,b);}运行结果:x,y120,121向字符变量赋以整数定义a,b为字符型赋值语句中赋以整型值格式符"c",输出字符格式符为"d",输出整数voidmain(){chara,b;a='a';b='b';a=a-32;b=b-32;printf("%c,%c\n%d,%d\n",a,b,a,b);}运行结果:A,B65,66

a,b被定义为字符变量并赋予字符值用字符的ASCII码参与运算大小写字母的ASCII码相差32,因此运算后把小写字母换成大写字母。然后分别以整型和字符型输出3、变量、变量名、变量类型、变量值、给变量赋值之间的关系变量——杯变量名——杯子的号码变量类型——所装的材料名称变量值——所装的东西多少给变量赋值——把某材料倒进杯子水1号杯水2号杯油3号杯若类型不一致、以变量为准inta;a=123.5;则a为12340*变量的特性:①一个变量只有一个值②新的不来、旧的不去,新的一来、旧的立即丢失③取之不尽例:inta;

……a=3;

……a=7.8;

……这段时间a值为3这段时间a值为7414、两类常用赋值表达式的特别表示(1)自增、自减运算符①<变量>=<变量>+1

可用++<变量>

代替例:i=i+1、count=count+1<变量>=<变量>–1

可用–

–<变量>

代替例k=k–1、num=num–1②<变量>++与

++<变量>的区别

<变量>++

的值为变量增一前的值

++<变量>的值为变量增一的值同样,<变量>–

的值为变量减一前的值

–<变量>的值为变量减一的值提高可执行程序的质量++i++count–

–k–

–num例:

voidmain(){inti,j,k;i=3;j=++i;i=3;k=i++;printf(”%d,%d\n”,j,k);i=3;j=–

–i;i=3;k=i–

–;printf(”%d,%d\n”,j,k);}

j为4i为4i为3重新赋值k为i增1前的值i为3重新赋值结果:

4,32,343例:voidmain(){inti,j,k;i=3;j=++i;k=i++;printf(”%d,%d\n”,j,k);i=3;j=i–

–;k=–

–i;printf(”%d,%d\n”,j,k);}

j为4i为4k为4,运行之后i为5j为3,运行之后i为2结果:4,43,144(2)复合的赋值运算符①<变量>=<变量>+表达式

<变量>=<变量>–表达式

<变量>=<变量>*表达式

分别可用<变量>+=表达式

<变量>–=表达式

<变量>*=表达式

代替

…i=i+3sum=sum+y+8n=n–2sum=sum–3*wn=n*2sum=sum*(3+w)i+=3sum+=y+8n–=2sum–=3*wn*=2sum*=3+w45+=、–=、*=、/=%=求余<<=左移>>=右移

&=按位与

^=按位异或

|=按位或10种复合的赋值运算符:3.5

符号常量

用#define命令宏定义一个符号常量(用标识符命名)代表某一常量作用:减少程序中重复书写某些常量的工作量例#definePI3.141592#include<math.h>voidmain()

{printf(”%f,%f\n”,sin(35*PI/180),cos(35*PI/180));}注意:1.符号常量名中的英文字母习惯用大写

2.不能象给变量赋值那样给符号常量赋值

3.符号常量即以后要讲的宏名的用途。调用函数库中的函数a=3.14159合法3.14159=a非法47例:#defineS“ThisisaCProgram.”voidmain(){printf(S);}双引号483.6运算符与表达式

由P365附录III中的运算符把常量、符号常量、变量、函数等连接起来的有意义的式子:如:a+=a*=(b=2)/(float)(int)(a=4.5)…..

49(1)算术运算符:用于各类数值运算:加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。(2)关系运算符:用于比较运算:大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。(3)逻辑运算符:用于逻辑运算:与(&&)、或(||)、非(!)三种。3.6.1C语言的运算符:P365(4)位操作运算符:参与运算的量,按二进制位进行运算:位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。(5)赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。(6)条件运算符:这是一个三目运算符,用于条件求值(?:)。(7)逗号运算符:用于把若干表达式组合成一个表达式(,)。(8)指针运算符:用于取内容(*)和取地址(&)二种运算。(9)求字节数运算符:用于计算数据类型所占的字节数(sizeof)。(10)特殊运算符:有括号(),下标[],成员(→,.)等几种。523.6.2表达式

一、赋值表达式:

1.三种形式的赋值表达式一般赋值表达式:

自增自减表达式:复合赋值表达式:

t*=j/(2*j+1)k++s=6*a+12、赋值表达式举例:a=b=c=5a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)表达式的值为5,a,b,c的值均为5表达式的值为11,a值为11,c的值为6表达式的值为10,a为10,b为4,c为6表达式的值为5,a为5,b为10,c为254二.算术表达式:类似数学中的代数式pow(a,2)*b/c+1.5*fabs(sin(x*3.14159/180))/’a’P371函数a2b/c+1.5|sin(3.14159x)/180|/97

abs(整型)fabc(实型/整型)551、算术运算符的有关说明:两个整数相除,如果有小数部分:1、结果为整数:舍去小数部分,取整;2、结果为负数:舍入方向不固定,采取“向零取整”的方法,即取整后向“0”靠拢。如:-5/3=-1l运算符的优先级:P365,优先级较高的先于优先级较低的。一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。l运算符的结合性:分为左结合性(自左至右)和右结合性(自右至左)。

x-y+z(左结合性):

x=y=z(右结合性):x与“-”号结合执行x-y执行+z执行y=z执行x=(y=z)572、算术表达式的有关说明:1、对表达式:(++i)+(++i)+(++i)TurboC将3作为表达式中所有i的值,因此3个i相加,得表达式的值为9。编程时应避免这种歧义性,应写成:

i=3;a=i++;b=i++;c=i++;d=a+b+c;2、设i的初值为3,语句printf(“%d,%d”,i,i++);有的系统具有左结合性,而另一些系统具有有结合性,结果分别为:3,3和4,3。编程时应避免这种歧义性,应写成:

j=i++;printf(“%d,%d”,j,i);583.含有强制类型转换运算符的表达式:即表达式中含(类型名)(表达式)例.(int)a例.w+(float)(j%k)/5

整体的值为int类型,a及a的值为原类型值为float类型,j、k及它们的值仍为原来的类型59例:voidmain(){floatx=3.6;intk;k=(int)x/5;printf(”x=%f,k=%d\n”,x,k);}

结果x=3.600000,k=0360强制转换运算符的意义例如:1/2*sqrt(x+y)结果为0intfloatintfloat(float)1/2*sqrt(x+y)0.5取整一般写为1.0/261例如:floatk=3必须写成abs((int)k)因为abs函数中的参数必须是整型的见P371求整数的绝对值函数62三、逗号表达式:

格式:表达式1,表达式2,······表达式n

功能:从左至右顺序计算各表达式的值,以表达式

n的值作为逗号表达式

的值(整体)

例1.

定义:ints,p;

则执行s=5;p=s++,++p,p+2,p++;

优先级最低p为5,先将5赋给p后,s的值再加1p为6p的值是7,是整个逗号表达式最终的值未赋值63

例:若有定义:inta,b;则表达式:

a=4,b=3,a+b+2,a++,a+b+2

值是10,是整个逗号表达式最终的值a为4b为3a为5最终b值为3优先级高a、b未赋值64例:voidmain(){inta=2,b=4,c=6,x,y;y=(x=a+b),(b+c);printf("y=%d,x=%d",y,x);}运行结果:y=6,x=6

x为6赋值优先,y为6逗号表达式的值为10对于逗号表达式还要说明两点:1)逗号表达式一般形式中的表达式1和表达式2也可以又是逗号表达式(嵌套)。例如:

表达式1,(表达式2,表达式3)因此可以把逗号表达式扩展为以下形式:

表达式1,表达式2,…表达式n整个逗号表达式的值等于表达式n的值。2)程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符。66四、组合运算符例:i+++j

可理解为(i++)+j

不能理解为i+(++j)组合原则:

尽可能多地(自左而右)将若干个字符组成一个运算符67五、表达式的运算顺序:

一般按从左至右、P365附录III优先级序数(1—先,7—后)进行;(但赋值运算、自增、自减、负号运算、类型转换等从右至左)优先级高的先算

“左结合性”:自左至右的结合方向。算术运算符的结合性是自左至右,即先左后右。如:表达式x-y+z

(1)y应先与“-”号结合,执行x-y运算;(2)再执行+z的运算。“右结合性”:自右至左的结合方向。最典型的右结合性运算符是赋值运算符。如:表达式x=y=z,由于“=”的右结合性,(1)先执行y=z运算;(2)再执行x=(y=z)运算。

C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。附录III693.7

各类型数据的混合运算

在计算过程中、若某次运算时碰到运算对象为不同类型才需要进行转换,且由低向高转换。注意边计算边转换。但float型数据都要转换成double型

char型与short型数据都要转换成int型转换规则如下图:70intchar,shortdoublelongunsignedfloat低高P54例:设已定义floata=14.7;longc=5;计算13/5*a+(’a’+’b’)/c的步骤及转换类型13/5*a+(’a’+’b’)/c12int2.0double14.7double229.4double97int98int3195int195long5long439long39double568.4double例:设定义floata;intb;从右至左运算表达式:a+=a*=(b=2)/(float)(int)(a=4.5)12int24.5float34int44.0float2.0double4.0double50.5double4.5float4.5double62.25double74.5double2.25double给a赋值给a赋值例:voidmain(){floatPI=3.14159;ints,r=5;s=r*r*PI;printf("s=%d\n",s);}

运行结果:s=78实型此语句将r和PI都转换成double型计算结果为double型但由于s为整型,故赋值结果仍为整型,舍去了小数部分。743.8

不同类型赋值的结果赋给变量的数据类型、大小一般不受限制唯一限制:3.8.1变量或数据中含有实型的:

------值大小不变1、double型数据赋给float型,截取前7位有效数据。2、float型数据赋给double型,有效数据扩展到16位,但范围不能溢出。3、若把实型数据赋给整型变量,则舍去小数部分。

不允许给实型变量赋超出其所能表示范围的数据例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论