c2基本数据类型、运算符和表达式_第1页
c2基本数据类型、运算符和表达式_第2页
c2基本数据类型、运算符和表达式_第3页
c2基本数据类型、运算符和表达式_第4页
c2基本数据类型、运算符和表达式_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计第2章基本数据类型、运算符与表达式1问题:人类的语言书写时,不同国家有不同的要求,基本的如:有哪些数据是规定可用的,可进行什么样的运算和加工?C中的数据和操作用字要求格式要求标点要求

C语言作为一种计算机语言,在用于编程时,C语言中对数据的类型,哪些操作运算是合法的,都进行了相关的规范和要求。引子2

本章要点第2章数据类型、运算符和表达式

本章难点

C语言的基本数据类型变量的定义、赋值、初始化及使用方法基本运算符的运算规则及优先级别表达式的构成规则和计算数据类型转换的意义和实质

数据类型的作用及注意事项自增、自减运算符的使用运算符优先级别混合表达式运算类型转换及转换过程中出现的误差32.12.22.32.42.5C语言的数据类型常量与变量整型数据实型数据字符型数据本章主要内容42.62.72.82.92.10算术运算符与算术表达式赋值运算符与赋值表达式逗号运算符与逗号表达式位运算符数据类型转换与计算类型长度运算符本章主要内容5数据类型总表数据类型基本类型构造类型指针类型空类型void字符类型char枚举类型整型实型单精度型float双精度型double数组结构体struct共用体union短整型short长整型long整型int数据类型决定:1.数据占内存字节数2.数据取值范围2.1C语言的数据类型不可再将其分解成其他类型构造类型数据可以分解成若干个"成员"或"元素",各"成员"的类型可以相同,也可以不同,可以是基本数据类型,也可以是构造类型。值用来表示某个量在内存储器中的地址函数类型说明了返回值的类型,但有些函数没有返回值,这种函数类型定义为空类型(void)。62.12.22.32.42.5C语言的数据类型常量与变量整型数据实型数据字符型数据本章主要内容7常量定义:程序运行时其值不能改变的量(即常数)分类:字面常量:又称直接常量整型常量:12、0、−3;实型常量:4.6、−1.23字符常量:'a'、'b'符号常量:8标识符定义:标识符是用户自定义的一种字符序列,用于表示程序中需要辨认的对象,比如变量、数组、函数等对象的名字。分类:关键字、预定义标识符和用户标识符

命名原则:由字母、数字、下划线组成的一串符号,但必修以英文字母或下划线开头标识符区分大小写不能使用关键字作为用户标识符见名知意建议用户标识符不要与预定义标识符相同不宜混淆如l与I,o与0长度:VC6.0为255个字符例:判断下列标识符号合法性sumSumM.D.JohndayDate3daysstudent_name#33lotus_1_2_3chara>b_above$123M.D.John3days#33char$123a>b2.2常量与变量由C语言规定的具有特定含义的标识符,也称为保留字关键字均为小写,如int、while预定义标识符在C语言中有特定的含义,如printf、include

9符号常量也称宏常量定义:用一个标识符代表一个常量。由C语言中的宏定义预处理命令来定义。定义格式:#define符号常量常量标识符符号常量应遵循标识符的命名规则

习惯上用大写字母常量可以是任何类型符号常量一经定义,凡在源程序中使用该符号常量时,都用其后指定的常量来替换。

例2.1符号常量的使用#include<stdio.h>#definePI3.14159#defineR5.3main(){printf("area=%f\n",PI*R*R); /*输出圆面积*/printf("circumference=%f\n",2*PI*R); /*输出圆周长*/}运行结果:area=88.247263circumference=33.300854如#definePRICE30修改程序方便阅读程序方便

10变量功能:用来保存程序运行过程中的输入数据、计算获得的中间结果和最终结果。变量定义的一般格式:

类型标识符变量名1,变量名2,…;变量初始化:定义时赋初值

变量的使用:先定义,后使用例:inta,b,c;floatdata;类型标识符变量名[=初值];例:inta=2,b,c=4;floatdata=3.67;charch=‘A’;intx=1,y=1,z=1;

intx=y=z=1;决定分配字节数和数的表示范围例:intstudent;stadent=19;//Undefinedsymbol‘statent’infunctionmain

11inta=1,b=-3,c;…...地址abc4字节4字节4字节地址地址…...-3随机数1编译程序根据变量定义为其分配指定字节的内存单元变量名与变量值12main(){inta,b=2;a=1;floatdata;data=(a+b)*1.2;printf(“data=%f\n”,data);}变量定义位置:变量定义语句可放在函数外,也可放在函数或复合语句内。132.12.22.32.42.5C语言的数据类型常量与变量整型数据实型数据字符型数据本章主要内容14三种形式:十进制整数:由数字0~9和正负号表示.(与日常使用的整数写法一样)如:0,-143,87八进制整数:由数字0开头,后面是八进制数字序列,数字取值范围为0~7。如:00、−015、037十六进制整数:以0x或0X开头的十六进制数字序列,数字取值范围为0~9、a~f或A~F。如:0x0、-0xABC、0X9fc2.3整型数据整型常量(整数)是数字0,不是字母o

非法的八进制数:0539、02A、0−567

非法的十六进制数:0xfg、0x-89F

问题:0123=()100x123=()100Xff=()10问题:0123=()100x123=()100Xff=()108329125515整型变量的分类根据表达范围: 基本整型(int)、短整型(shortint)长整型(longint) 标准C语言规定:shortint≤int≤long

int根据是否有符号: 有符号型(signed)和无符号型(unsigned)若未指定是否有符号,则隐含为有符号型(signed)2.3整型数据整型变量用来存放整数,基本类型为int型如:int型数据是有符号,而unsignedint是无符号的。16VC6.0中整型变量的所占字节数和数值范围整型类型符占用字节数数值范围[signed]int4−2147483648~2147483647即−231~(231−1)[signed]short[int]2−32768~32767即−215~(215−1)[signed]long[int]4−2147483648~2147483647即−231~(231−1)unsigned[int]40~4294967295即0~(232−1)unsignedshort[int]20~65535即0~(216−1)unsignedlong[int]40~4294967295即0~(232−1)17整型变量的定义在定义整型变量时,某些类型修饰符可以省略

int

a,b,c; /*a,b,c为有符号整型变量*/longx,y; /*x,y为有符号长整型变量*/unsignedp,q; /*p,q为无符号整型变量*/在存储正数时,无符号整型变量的数值范围比有符号整型变量的数值范围扩大一倍,如果能事先确定存储的数是正整数(如年龄、库存量、人数等),则可将变量定义为无符号类型,以充分利用变量的数值范围。18整型数据在内存中的存放形式在内存中数据是以二进制形式存放的有符号整型数无符号整型数0111111111111111signedshort(最大值)unsignedshort(最大值)1111111111111111符号位

012345678910111213141519实际上,整型数据是以补码的形式来存储的。正数的补码负数的补码

原码相同将原码的符号位保持不变,数值位逐位取反(变为反码)末位(即最右边的那一位)加1求:-10的补码

(1)写出−10的原码(2)数值位取反,得−10的反码(3)末位加1,得−10的补码10000000000010101111111111110101111111111111011020整型数据的溢出shortint型变量的最大允许值为32767,如果再加1,会出现什么情况?例2.2整型数据的溢出。#include<stdio.h>main(){shorta,b;a=32767;b=a+1;printf("%d,%d",a,b);}a和b的存储格式:a0111111111111111b1000000000000000运行结果为:32767,-3276821整型常量的类型整型常量也有基本整型、长整型、有符号和无符号之分编译程序会根据数值大小分辨出常量是int还是longint类型。int型和long型数据均占4个字节,在−2147483648~2147483647范围内的常量认为是int型。需要明确地指出整数是否属于longint类型,要在整数的末尾要加上字母L或l。

在表示无符号整型常量时,需要在数值后添加字母U或u作为后缀,若是长整型无符号整型常量,则可以加后缀LU或lu,无论是基本整型数还是长整型数,都被识别为有符号整数有符号整数无符号整型常量例:148、013、148L、0x38Alu、013L、0x38Au、0x16L、358U、0x16、358LU148、013、0x16148L013L0x16L0x38Au358U0x38Alu358LU222.12.22.32.42.5C语言的数据类型常量与变量整型数据实型数据字符型数据本章主要内容23表示形式:小数形式:数学中常用的实数形式,由数字0~9和小数点组成。

(必须有小数点)如:0.0、25.0、5.789、0.13、5.0、300.、−267.8230

指数形式:也称为科学记数法,由尾数(可带符号)、阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。(字母e或E的前后及数字之间不能插入空格

)例如:2.1E5(等于2.1×105),3.7E-2(等于3.7×10−2),0.5E7(等于0.5×107),−2.8E-2(等于−2.8×10−2)2.4实型数据实型常量(浮点型常量、实数或浮点数)345E7−553.-E32.7E无小数点

阶码标志E之前无数字无阶码标志负号位置不对

无阶码24float(单精度):占32位,提供7位有效数字double(双精度):占64位,提供16位有效数字long

double(长双精度型):占64位,提供16位有效数字2.4实型数据实型变量(浮点变量)floata=1.5,b=0.35,c; /*定义单精度实型变量a、b、c,并对a、b初始化*/doublex,y,z;/*定义双精度实型变量x、y、z*/25实型数据在内存中的存放形式

无论表示形式是小数还是指数,均以指数格式存储

实数的存储由符号位、指数(阶码)以及尾数(小数)等三部分组成。

例如:实数31.4159

尾数指数+2314159符号位float:共占32位。1位符号位、8位指数和23位尾数;double:占64位。1位符号位、11位指数和52位尾数。指数部分占的位数多,则表示的数值范围大。尾数部分占的位数多,实型数据的有效数字就多,精度就高。尾数部分就是有效二进制数字,经过计算可换算成十进制有效数字位数(近似值)。26实型变量的舍入误差由于实型变量是用有限的存储单元存储的,因此提供的有效数字是有限的,往往会产生误差。

在十进制小数转换成二进制时,如果小数最后一位不是5,则转换的二进制小数往往是无限位,此时产生舍入误差一个很大的数和一个很小的数直接进行加或减时,可能会“丢失”小的数。例2.3实型变量的舍入误差。#include<stdio.h>main(){floata,b;a=123456.72e5;b=a+20;printf("a=%f\n",a);printf("b=%f\n",b);}本例程序运行的结果是:a=12345671680.000000b=12345671680.00000027例4.5E1F、-4.5E-2F实型常量的类型默认double型在实型常量后加字母f或F,认为它是float型282.12.22.32.42.5C语言的数据类型常量与变量整型数据实型数据字符型数据本章主要内容29定义:用单引号(’)括起来的一个字符。2.5字符型数据字符型常量如‘a’‘b’‘=’‘+’‘?’存储:字符常量占用一个字节,具体存放的是该字符对应的ASCII代码值。如‘A’—65,‘a’—97,‘0’—48,‘1’—49可以进行运算例如:'a'+5、'A'−5、'1'+10102605930aaa字符常量的特点:字符常量只能用单引号括起来,不能用双引号或其他括号'abc'是非法的字符常量只能是单个字符C语言规定,字母是区分大小写的,所以'a'和'A'是不同的字符常量31转义字符一种特殊形式的字符常量——转义字符某些控制字符(如回车符、换行符等)和一些ASCII字符却无法使用字符常量进行表示转义字符以反斜线“\”开头,后跟一个或几个字符。<转义字符及其含义:转义字符含义\n\v\r\a\‘\ddd\t\b\f\\\“\xhh转义字符含义换行垂直制表回车响铃单引号1~3位8进制数代表的字符水平制表退格换页反斜线双引号1~2位16进制数代表的字符如‘\101’-----------‘A’‘\012’-----------’\n’‘\376’-----------’’‘\x61’-----------’a’‘\60’-----------’0’‘\483’----------()例:‘A’-------’\101’-------’\x41’--------6532定义:用双引号(“”)括起来的字符序列

字符串常量"CHINA","Cprogram","12365478"

转义字符也可以出现在字符串"\\ABCD\\"、"\101\102\x34\x44"字符常量与字符串常量的区别字符常量由单引号括起来,字符串常量由双引号括起来字符常量只能是单个字符,字符串常量可以为空字符串,也可以含1个或多个字符可以把一个字符常量赋予一个字符变量,C语言中没有字符串变量,不能把一个字符串常量赋予一个字符串变量。但可以用一个字符数组来存放一个字符串常量字符常量占1个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1,增加的一个字节由系统自动存入字符"\0"(ASCII码为0),作为字符串结束的标志。33hello\0例字符串“hello”在内存中例空串“”\0aa

\0例‘a’“a”例:charch;ch=“A”;例:charch;ch=‘A’;34例转义字符举例

main(){printf("\101\x42C\n");printf("Isay:\"Howareyou?\"\n");printf("\\CProgram\\\n");printf("Turbo\'C\'");}例main(){printf(“¥\b=\n”);}运行结果:(屏幕显示)ABCIsay:”Howareyou?”\CProgram\Turbo‘C’运行结果:屏幕显示:=35字符变量用于存放单个字符常量,使用char来定义。字符变量在内存中占一个字节例2.4字符变量的值。#include<stdio.h>main(){chara=0x1261,b;b=a-32;printf("%c,%c\n%d,%d\n",a,b,a,b);}没有字符串变量,用字符数组存放字符型变量charc1='x',c2='y',c3;charoptr;字符型数据和整型数据之间可以通用。程序运行的结果为:a,A97,65当整型变量按字符变量处理时,只有低八位参与处理。362.62.72.82.92.10算术运算符与算术表达式赋值运算符与赋值表达式逗号运算符与逗号表达式位运算符数据类型转换与计算类型长度运算符本章主要内容37学习运算符应注意:运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型2.6算术运算符和算术表达式38基本算术运算符基本算术运算符:+

-*/%说明:双目运算符两边的运算对象的类型不一致,使运算符两边的类型达到一致后,再进行运算。除运算的结果与运算对象的数据类型有关,两整数相除,结果为整数%要求两侧均为整型数据C语言中,所有实型数的运算均以双精度方式进行。若是单精度,则在尾数部分补0,使之转化为双精度数。正负号运算符为+(正号)和−(负号)。它们为单目运算符,必须出现在运算对象的左边,运算对象可以是整型,也可以是实型例5/2=-5/2.0=例5%2=-5%2=1%10=

5%1=5.5%2例5/2=2

-5/2.0=-2.5例5%2=1

-5%2=-11%10=

1

5%1=

05.5%2()运算结果是两数相除后所得的余数,结果的符号与编译系统有关。在TurboC和VC中,所得结果的符号与被除数相同。39算术表达式及算术运算符的优先级和结合性算术表达式:用算术运算符将运算对象连接起来的表达式称为算术表达式。算术表达式运算规则和要求:可使用多层圆括号,但左右括号必须配对,运算时从内层圆括号开始,由内向外依次计算表达式的值。按运算符的优先级别由高到低进行,若表达式中运算符的级别相同,则按运算符的结合方向进行。算术运算符的结合性两个优先级相同的运算符,则按结合方向顺序处理。自左至右(称为左结合性)和自右至左(称为右结合性)同级单目算术运算符的结合性是自右向左,同级双目算术运算符的结合性是自左向右。40基本算术运算符对象数优先级名称运算符运算规则运算对象结合性单目1正+取原值整型或实型自右向左负-取负值双目2乘*乘法整型或实型自左向右除/除法模%整除取余整型3加+加法整型或实型减-减法41算术运算符的优先级当表达式中出现多个运算符时,就会碰到哪个先算,哪个后算的问题,这个问题称为运算符的优先级若一个运算对象两侧有不同的运算符,应先执行“优先级别”高的运算,例如先乘除后加减。42自增、自减运算符++--作用:使变量值加1或减1种类:前置++i,--i(先执行i+1或i-1,再使用i值)后置i++,i--(先使用i值,再执行i+1或i-1)例2.5自增、自减运算符的使用。#include<stdio.h>main(){inti=5,x;x=i++; printf("i=%d,x=%d\n",i,x); printf("%d\t",++i);printf("%d\t",--i); printf("%d\t",i--); printf("%d\t",-i++);printf("%d\n",-i--);}程序运行结果如下:i=6,x=5766-5-6使用自增、自减运算符时应注意:运算对象不能是常量和表达式当出现难以区分的若干个+或-组成运算符串时,自左向右取尽可能多的符号组成运算符。不要在一个表达式中对同一个变量进行多次诸如i++或++i等运算例如写成:i++*++i+i−*−i如i+++j应理解为(i++)+j,而不是i+(++j)。432.62.72.82.92.10算术运算符与算术表达式赋值运算符与赋值表达式逗号运算符与逗号表达式位运算符数据类型转换与计算类型长度运算符本章主要内容44简单赋值运算符符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量复合赋值运算符种类:+=-=*=/=%=《=》=&=^=|=含义:exp1op=exp2

exp1=exp1opexp2a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3例a=3;d=func();c=d+2;2.7赋值运算符和赋值表达式45说明:结合方向:自右向左优先级:只高于逗号运算符,比任何其他运算符的优先级都低左侧必须是变量,不能是常量或表达式赋值表达式的值与变量值相等,且可嵌套赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型例3=x-2*y;a+b=3;例

floatf;inti;i=10;f=i;则

f=10.0例inti;i=2.56;//结果i=2;例:a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)//表达式值为5,a,b,c值为5//b=5;a=5//表达式值11,c=6,a=11//表达式值10,a=10,b=4,c=6//表达式值5,a=5,b=10,c=246说明:结合方向:自右向左优先级:12左侧必须是变量,不能是常量或表达式赋值表达式的值与变量值相等,且可嵌套赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型例:a=12;a+=a-=a*a例:inta=2;a%=4-1;a+=a*=a-=a*=3;//a=-264等价于a=a+(a=a-(a*a))//a=0等价于a=a+(a=a*(a=a-(a=a*3)))472.62.72.82.92.10算术运算符与算术表达式赋值运算符与赋值表达式逗号运算符与逗号表达式位运算符数据类型转换与计算类型长度运算符本章主要内容48形式:表达式1,表达式2,……表达式n结合性:从左向右优先级:在所有运算符中是最低的逗号表达式的值:等于表达式n的值用途:常用于循环for语句中例a=3*5,a*4a=3*5,a*4,a+5例x=(a=3,6*3)x=a=3,6*a例a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);//a=15,表达式值60//a=15,表达式值20//赋值表达式,表达式值18,x=18//逗号表达式,表达式值18,x=3//1,2,3//3,2,32.8逗号运算符和逗号表达式例2.6逗号运算符。#include<stdio.h>main(){intx,a;x=(a=3,6*3);printf("a=%d,x=%d\n",a,x);x=a=3,6*a;printf("a=%d,x=%d\n",a,x);}程序运行的结果应为:a=3,x=18a=3,x=3492.62.72.82.92.10算术运算符与算术表达式赋值运算符与赋值表达式逗号运算符与逗号表达式位运算符数据类型转换与计算类型长度运算符本章主要内容50位运算符种类:~

<<>>&^|位运算:对运算对象按二进制位进行操作。位运算对象:只能是整型或字符型数据,不能是其他类型的数据,其运算结果仍是整型或字符型数据~:运算对象在运算符的右边功能:对运算对象的各二进位按位求反,即使每一位上的0变1;变1为0。例~9:运算结果为-109的二进制表示:0000000000001001

按位求反后为:1111111111110110即:-10<<:左移例如:a<<4功能:把a的各二进位向左移动4位若a=00010011(十进制19),左移4位后为00110000(十进制48),其中左端移出的0001四位丢弃,低位补0000。>>:右移例如:a>>2功能:把a的各二进位向右移动2位若a=0000000000001111(十进制15),右移2位后为0000000000000011(十进制3)。

“&”:按位与例如:9&(-5)0000000000001001(9的二进制补码)&1111111111111011(-5的二进制补码)=0000000000001001(9的二进制补码)可见9&(-5)=9。

“^”:按位异或例如:9^(5)00001001(9的二进制补码)^00000101(5的二进制补码)=00001100(十进制为12)

“|”:按位或例如:9|(5)00001001(9的二进制补码)|00000101(5的二进制补码)=00001101(十进制为13)2.9位运算符和表达式51C运算符算术运算符:(+-*/%++--)关系运算符:(<<===>>=!=)逻辑运算符:((!&&||)位运算符:(<<>>~|^&)赋值运算符:(=及其扩展)条件运算符:(?:)逗号运算符:(,)指针运算符:(*&)求字节数:(sizeof)强制类型转换:(类型)分量运算符:(.->)下标运算符:([])其它:(()-)运算符和表达式小结522.62.72.82.92.10算术运算符与算术表达式赋值运算符与赋值表达式逗号运算符与逗号表达式位运算符数据类型转换与计算类型长度运算符本章主要内容53自动类型转换什么情况下发生运算转换------不同类型数据混合运算时赋值转换------把一个值赋给与其类型不同的变量时输出转换------输出时转换成指定的输出格式函数调用转换------实参与形参类型不一致时转换运算转换规则:不同类型数据运算时先自动转换成同一类型2.10不同类型数据间的转换54doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例charch;inti;floatf;doubled;ch/i+f*d-(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+‘a’+i*f-d/l例inti;floatf;doubled;longl;2.10不同类型数据间的转换55在赋值转换时,与算术转换类似,低级别数据类型向高级别类型的转换一般不会出现问题,如float型向double型、整型向浮点型转换。但有些情况的赋值转换可能会出现问题。(1)将长整型数据赋给短整型或字符型变量时,高位字节的数据将丢失。例2.7赋值转换时高位字节的丢失。#include<stdio.h>main(){shorta=289;charc;longb=98304;c=a;/*截取a的低8位赋给c*/a=b;/*截取b的低16位赋给a*/printf("a=%d\tc=%d\n",a,c);}运行结果如下:a=-32768c=3356(2)将有符号整型数据赋给无符号整型变量时,把内存中存储的二进制数字原样复制,所以负数将转换为正数。例如:unsignedshorta;a=−1printf(“%u”,a);注意左边变量的数值范围a的值为65535。(3)将无符号整型数据赋给有符号整型变量时,复制机制同上。这时若符号位为1,将按负数处理。(4)将浮点型数据赋给整型变量时,舍弃浮点数的小数部分。例如:inti;i=3.567printf(“%d”,i);i的值为3(5)将doub

温馨提示

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

评论

0/150

提交评论