版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章
数据类型及其运算第3章
数据类型及其运算C程序结构基本数据类型、变量与常量赋值运算符与赋值表达式算术运算符与算术表达式逗号运算与逗号表达式
运算符的优先级与结合性混合运算时数据类型的转换主要内容C程序结构主要内容C程序结构例3-1从键盘输入半径,求圆的周长和面积。算法思路:radius:存放从键盘输入的半径;
计算周长:perimeter=2*PI*radius;
计算面积:area=PI*radius*radius;输出perimeter和area的值不确定性列公式C程序结构例3-1从键盘输入半径,求圆的周长和面积。算法思#include<stdio.h>doublePI=3.14;intmain(){ intradius; doubleperimeter,area; printf("Inputaradius:"); scanf("%d",&radius); perimeter=2*PI*radius; area=PI*radius*radius; printf("Theperimeteris%.2f,Theareais %.2f\n",perimeter,area); return0;}声明变量radius提示输入输入数据赋给radius计算周长和面积输出结果预处理命令全局变量声明函数定义#include<stdio.h>声明变量radius提示组成C源程序的三个要素(1)
预处理命令。C编译程序对源程序编译前,先由预处理器对预处理命令进行预处理。(2)全局声明。包括全局变量声明和函数原型声明。(3)函数定义。一个C语言程序必须有一个main函数。函数由一组语句组成。比语句更小的语法单位:表达式、变量、常量和关键字等。组成C源程序的三个要素(1)预处理命令。C编译程序对源程序#include<stdio.h>/*函数功能:计算两个整数相加之和入口参数:整型数据a和b
返回值:整型数a和b之和*/intAdd(inta,intb){ return(a+b);}intmain(){ intx,y,sum=0; printf("Inputtwointegers:"); scanf("%d%d",&x,&y); /*输入两个整型数x和y*/ sum=Add(x,y); /*调用函数Add计算x和y相加之和*/ printf("sum=%d\n",sum); /*输出x和y相加之和*/ return0;}#include<stdio.h>关键字(Keyword)又称为保留字,C语言预定的具有固定含义的一些单词例如:数据类型修饰符int,控制语句return等
autobreakcasecharcontinueconstdefaultdoubledo
elsefloatforifintlongNULLreturnswitchshort
signed
truethisunsignedvoidwhileC程序常见符号—关键字关键字(Keyword)autobreakcasC程序常见符号大小写的英文字母:A~Z,a~z数字字符:0~9特殊字符:
空格 ! % ^ & _(下划线) + * = - ~<
> / \ ' " ; . , ()
[] {}C程序常见符号大小写的英文字母:A~Z,a~zC程序常见符号—标识符标识符(Identifier)分系统预定义标识符和用户自定义标识符以字母和下划线开始,大小写敏感,最长32个字符。以大写字母、小写字母、下划线或数字0~9组成。直观,见名知意,便于记忆和阅读最好使用英文单词或其组合,忌使用汉语拼音不宜混淆如1与l,o与0不允许使用关键字作为标识符的名字int,float,for,while,if等C程序常见符号—标识符标识符(Identifier)例:判断下列标识符号合法性,并标出不合法的标示符。sum Sum M.D.John dayDate 3days student_name#33 lotus_1_2_3 chara>b _above $123M.D.John3days#33char$123a>bC程序常见符号—标识符例:判断下列标识符号合法性,并标出不合法的标示符。M.D.J运算符(Operator)34种,详见附录分隔符(Separator)空格、回车/换行、逗号等其它符号大花括号"{"和"}"
"/*"和"*/"、//是程序注释所需的定界符数据(Data)变量(Variable)常量(Constant)C程序常见的其他符号运算符(Operator)C程序常见的其他符号数据类型、常量和变量数据为什么要区分类型?不同类型的数据代表不同的数据表示形式合法的取值范围占用内存空间大小可参与的运算种类
数据类型、常量和变量数据为什么要区分类型?数据类型基本类型构造类型指针类型空类型整型实型(浮点型)字符型枚举类型数组类型结构体类型共用体类型单精度实型双精度实型基本整型长整型短整型无符号整型数据类型(DataType)数据类型基本类型构造类型指针类型空类型整型实型(浮点型)字符衡量数据类型所占空间大小的单位常用的单位如下:b,B,KB,MB,GB,TB
bit,中文叫法:位Byte,中文叫法:字节Kilobyte(KB),中文叫法:KMegabyte(MB),中文叫法:兆Gigabyte(GB),中文叫法:GTerabyte(TB),中文叫法:T1TB==
1,024GB1GB==
1,024MB1MB==
1,024KB1KB
==
1,024B1B==
8b衡量数据类型所占空间大小的单位常用的单位如下:1TB==如何衡量数据类型所占空间大小?一个位有多大?只能是"0"或者"1",这叫二进制一个字节有多大?保存一个字符(英文字母、数字、符号)ASCII(美国标准信息交换码)编码见附录A,常用字符与ASCII码对照表两个字节保存一个汉字GB编码可以表示0~255之间的整数如何衡量数据类型所占空间大小?一个位有多大?基本数据类型表3-1C的基本数据类型(32位机)基本数据类型表3-1C的基本数据类型(32位机)整型(integer)整型:有符号整数,允许取值为整数。如:123,567整型的分类:整型(int):占4个字节短整型(shortint):占2个字节,通常简写为short长整型(longint):占4个字节,通常简写为long数据类型修饰符整型(integer)整型:有符号整数,允许取值为整数。如:signed用来修饰char、int、short和long,说明他们是有符号的整数(正整数、0和负整数)。有符号数在计算机内以二进制补码形式存储的,最高位表示符号位(0为正数,1为负数)。一般缺省都是有符号的,所以这个修饰符通常省略。shortint型:最大:32767最小:-32768数据类型修饰符signedshortint型:最大:32767最小:-3unsigned用来修饰char、int、short和long,说明他们是无符号的整数(正整数和0)。无符号型在机内只能存放正数,最高位也来表示数值的。当数据占用同样内存位数时,无符号型数值范围比有符号数扩大一倍。数据类型修饰符unsigned
short
int型:最大:65535最小:0unsigned数据类型修饰符unsignedshort扩充的整型类型有符号基本整型[signed]int;无符号基本整型
unsignedint;有符号短整型[signed]short[int];无符号短整型
unsignedshort[int];有符号长整型[signed]long[int];无符号长整型unsignedlong[int];扩充的整型类型有符号基本整型[signed]int二进制存放与溢出(1)10=
(0000000000000001)2(-1)10=
(111111111111
1111)2(65535)10=
(11111111
11111111)2当65535按unsignedshortint型理解时,仍为65535;而当按shortint型理解时,被当作-1的补码。二进制存放与溢出(1)10=(00000000000字符型(char)字符型char的取值为单个字符。例如:
'A'、'
'用ASCII编码表示一个字符,每个字符占用1个字节,总共可以表示256个不同的字符。char类型前可用signed和unsigned加以修饰。例如: signedcharch=-128;unsignedcharch=255;思考:unsignedchar范围?字符型(char)字符型char的取值为单个字符。例如:'浮点型(floatpoint)浮点类型:允许取值为带小数的实数(如
123.46)双精度浮点型double单精度浮点型float
double比float的精度更高(即小数的有效位数更多),表示数据的范围也更大。浮点型(floatpoint)浮点类型:允许取值为带小数的常量常量(Constant)在程序执行过程中其值不变的量。常量包括以下几种:整型常量浮点常量字符常量字符串常量常量常量(Constant)在程序执行过程中其值不变的量。整型常量(short,int,long)整型常量18、-31longint型常量123l、123L、123456l、123456Lunsignedint型常量123u、123U整型常量的类型根据其值所在范围确定其数据类型在整型常量后加字母l或L,认为它是longint型常量例:12与12L整型常量(short,int,long)整型常量例:12与1整型常量的表示形式十进制形式:[±]若干个0~9的数字
如:100,-50,0
八进制形式:
[±]以0开头的若干个0~7数字
如:0123
表示十进制数83
-011
表示十进制数-9。十六进制形式
:[±]用0x或0X开头的若干个0~9,a~f,A~F的数字
如:
0X2F
表示十进制的数字47
0x123
表示十进制数291
-0x12
表示十进制数-18。整型常量的表示形式十进制形式:[±]若干个0~9的数字整型常量的表示形式例:0524为int型,在内存中是如何表示的?0101010000000001425例:01736L为longint型1101111000000011000000000000000063710000000000000000整型常量的表示形式例:0524为int型,在内存中是如何何谓类型溢出(Overflow)?C语言提供的任何类型都有取值范围。当向其赋超过此范围的数值,就会产生数值溢出,得到一个不正确的结果。例如:shortint的范围是-32768~32767如果超出取值范围,给它一个小于-32768或者大于32767的数会如何呢?小蛇能吞下大象吗?何谓类型溢出(Overflow)?C语言提供的任何类型都有取注意事项Example:看程序分析运行结果#include<stdio.h>intmain(){ shortinta; printf("Input:"); scanf("%d",&a); printf("a=%d\n",a); return0;}
运行结果:
Input:12345
a=12345Input:1234567
a=-10617
整型≠整数short
int的范围:-32768~+32767Because:
12345的补码是0011000000111001
1234567的补码是100101101011010000111
截去多余部份(超过2个字节的左边部分)后
其原码为
1010100101111001(-10617)注意事项Example:看程序分析运行结果运行结果:整型≠有趣的结果可用下图表示:
327673276632765……-32766-32767-32768输入(Input:)输出(a=)327673276732768-3276832769-3276732770-32766-32768-32768-3276932767-3277032766有趣的结果可用下图表示:输入(Input:)输出(a=)类型溢出的解决方案?解决方案:预先估算运算结果的可能范围,采用取值范围更大的类型。1+2+3+…1!+2!+3!+…13+23+33+…如果不需要处理负数,则采用无符号类型。在运算还没开始之前就判断运算数是否在合理的取值范围内。如果超出,则停止运算,转错误处理。类型溢出的解决方案?解决方案:浮点型常量
(float,double)浮点型常量:可以含有小数部分的数值常量。根据占用内存长度的不同,分为:单精度浮点常量:占用32位内存,用F、f表示。
如:19.4F,3.0513E3f,8701.52f双精度浮点常量:占用64位内存,用带D或d或不加后缀(缺省)的数值表示
如:2.433E-5D,700041.273d,3.1415。longdouble型常量123.45l、456.78L、4.5e3L
因为字母l和数字1容易混淆,所以常使用大写L做后缀。浮点型常量(float,double)浮点型常量:可以含有浮点型常量的两种表示形式十进制小数形式:包括符号"+"与"-",数字0~9以及小数点"."。如:0.123,1.23,123.0指数形式:包括符号"+"与"-",数字0~9,小数点"."以及e(或E)。如:0.123e3表示0.123×103
-35.4E-5表示-35.4×10-5其中e或E之前必须有数字,且e或E后面的指数必须为整数。如:e-5,
1.2E-3.5不正确浮点型常量的两种表示形式十进制小数形式:包括符号"+"与"-浮点型常量
(float,double)
由于计算机系统分配给一个数据的存储空间是有限的。一般来说,一个实型常量无法转换成与之等值的有限位的二进制数据,其有限位以后的数字将被舍去,由此就会产生舍入误差。浮点型常量(float,double)由于例://下列程序的功能是将10个实型数0.1进行累加,然后将累加结果输出。#include<stdio.h>intmain(){ intk; /*定义整型变量k*/ doublex,z; /*定义双精度整型变量x与z*/ z=1.0; /*实数1.0赋给变量z*/ x=0.0; for(k=0;k<10;k++) x=x+0.1; /*10个0.1累加到变量x中*/ printf("z=%20.17f\n",z); /*输出变量z的值*/ printf("x=%20.17f\n",x); /*输出变量x的值*/ return0;}运行这个程序后,输出的结果如下:
z=1.00000000000000000x=0.99999999999999989例://下列程序的功能是将10个实型数0.1进行累加,然后字符常量
(Character)用一对单引号括起的单个字符,其值为该字符的ASCII码值。如:'A'—65,'\n'—10。注意:
'1'和整数1的区别字符'1'代表一个形状为'1'的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占1个字节整数1是以整数存储方式,占1个字节0011000100000001字符常量(Character)用一对单引号括起的单个字符,字符常量-转义字符用"\"开头的字符(例如,"\n",代表1个字符)表3-2常用转义字符字符常量-转义字符用"\"开头的字符(例如,"\n",代表1如:'\101'-----'A' '\012'-----'\n'
'\376'-----''
'\x61'-----'a'
'\60'-----'0'
'\483'-----例:'A'-----'\101'-----'\x41'-----65字符常量
(Character)()如:'\101'-----'A' '\012'-----转义字符举例例1:阅读程序,给出运行结果intmain(){ printf("\101\x42C\n"); printf("\\CProgram\\\n"); printf("Turbo\'C\'"); return0;}运行结果:(屏幕显示)ABC\CProgram\Turbo'C'转义字符举例例1:阅读程序,给出运行结果运行结果:(屏幕显示转义字符举例例2:阅读程序,给出运行结果intmain(){ printf("Y\b=\n"); return0;}运行结果:屏幕显示:=打印机输出:¥转义字符举例例2:阅读程序,给出运行结果运行结果:例3:阅读程序,给出运行结果#include<stdio.h>intmain(){
//'\t',跳到下一个输出区
printf("Howareyou?\t"); printf("Iamfine.\n\n"); printf("Howareyou?\n");
//退格符'\b',使当前输出位置退一格,即输出的起始位置左移一位
printf("
_\bIamfine.\n\n");
//回车符'\r',使当前输出位置回到本行开头
printf("Iamfine."); printf("\rHowareyou?\n\n");
//多个转义字符的混合运用
printf("note:\nas\ti\b\bk\rp\n"); return0;}Howareyou?____Iamfine._Howareyou?Iamfine.Howareyou?____Iamfine.
note:p_a_s__ki例3:阅读程序,给出运行结果Howareyou?__什么时候要使用转义字符?C程序中需要实现某些特定打印或显示动作时
如
printf("123\t56\n");C程序中需要打印或显示以下三个字符时
\
(斜杠)
"
(双引号)
'(单引号)
如
printf("You'rea
\"abadegg!\"");C程序中需要打印或显示ASCII表中非键盘字符时
如
printf("Look
\16
and
\x80!");注意:使用转义字符时,\后的八进制或十六进制数不应大于char类型所允许的范围(十进制值256)。什么时候要使用转义字符?C程序中需要实现某些特定打印或显示动字符串常量(String)用双引号括起的一串字符(可以0个)"Iamastring"""表示空字符串引号只作为字符串开始和结束的标志C语言内部自动用'\0'表示字符串的结束除注释外,是唯一可以出现中文的地方"A"和'A'是不同的字符'A'65
01000001占1字节
65'\0'字符串"A"占2个字节字符串常量(String)用双引号括起的一串字符(可以0个)枚举(Enumeration)常量一个被遗忘的角色从程序来窥其一斑 enumweeks{MON,TUE,WED,THU,FRI,SAT,SUN};
enumweekstoday;
enum
response{no,yes,none};
enum
responseanswer;
today=TUE; answer=yes;
if(answer
==yes) printf("TodayisTuesday.\n");
else
printf("TodayisNOTTuesday.\n");枚举(Enumeration)常量一个被遗忘的角色宏常量(符号常量)一般用大写字母表示#define
标识符
字符串不是语句,而是一种编译预处理命令#include<stdio.h>#definePI
3.14159#defineR
5.3intmain(){ printf("PI*R*R=%f\n",PI*R*R); printf("2*PI*R=%f\n",2*PI*R);
return0;}3.14159*5.3*5.32*3.14159*5.3宏常量(符号常量)一般用大写字母表示#include<sconst常量用const修饰定义的变量为常量声明格式: const数据类型常量名=缺省值;注意:常量只能在定义时赋值,而在程序的中间不能改变其值。常数、const常量、宏常量和枚举常量,都可以用来表示一个永远不会改变的数。前者不建议直接使用,而用后三者代替例如:constdoublePI=3.14159;floatr,area;area=PI*r*r;const常量用const修饰定义的变量为常量注意:例如:逻辑(布尔)型常量boolean在程序控制中经常用到布尔常量。例如:
if(条件)动作1else动作2布尔常量的值:true(真)和false(假)。C语言中将布尔类型映射为数值类型:
true用非0的整数表示
false用0表示如:
3+1==4
结果为true,通常表示1。inta=2>3结果为false,通常表示0。
逻辑(布尔)型常量boolean在程序控制中经常用到布尔常变量变量在程序执行过程中其值可以改变的量,因此用来记录运算中间结果或保存数据。变量的声明:
数据类型变量名1[,变量名2,…,变量名n];决定分配字节数和数的表示范围合法标识符short,int,long,float,double,char,unsigned
复合类型变量变量在程序执行过程中其值可以改变的量,因此用来记录运算中变量例:inta,b;doubledata;编译时,对变量声明语句将根据其类型分配存储空间。变量的名实际上对应空间的地址,变量的值对应空间的内容。在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。a:(2000)b:(3000)data:(4000)4字节8字节4字节变量例:编译时,对变量声明语句将根据其类型分配存储空间。变量例如:
shorts;
//给s变量分配两个字节,占用2000-2001单元
s=1234;
图3-1变量与内存单元的映射关系变量例如:图3-1变量与内存单元的映射关系变量的使用:先声明,后使用例1:
intstudent; stadent=19;变量的使用:先声明,后使用例1:变量的使用例2:
floata,b,c; c=a%b;变量的使用例2:变量的声明位置变量定义位置:一般放在函数开头intmain(){ inta,b=2; floatdata; a=1; data=(a+b)*1.2; printf("data=%f\n",data); return0;}变量定义可执行语句变量的声明位置变量定义位置:一般放在函数开头intmain变量的初始化:声明变量的同时指定变量初值格式:数据类型变量名=初始值;不被初始化的变量,其值为危险的随机数变量的初始化#include<stdio.h>intmain(){ charesc='a'; inti; doubleeps=1.0e-5; printf("esc=%c\ni=%d\neps=%lf",esc,i,eps); return0;}运行结果:esc=ai=-858993460eps=0.000010变量的初始化:声明变量的同时指定变量初值变量的初始化#inc例如:利用变量t交换变量x和y的值t=x;x=y;y=t;tyx变量的值主要通过赋值运算改变。变量值的改变例如:利用变量t交换变量x和y的值tyx变量的值主要通过赋值使用变量要注意不要对变量所占的内存空间字节数想当然用sizeof运算符:返回操作数存储空间的大小使用形式:sizeof(类型名)或
sizeof(变量名)结果为表达式值所属类型或者类型占用的字节数sizeof运算符也可以出现在表达式中。例如,x=sizeof(float)-2;
printf("%d",sizeof(double));注意!使用变量要注意不要对变量所占的内存空间字节数想当然注意!为什么要用sizeof获得类型或变量的字长?因为同种类型在不同的平台其占字节数不尽相同。比如int在16位、32位和64位系统分别占2、4和8个字节。现象与危害:在平台间移植时会出现问题,导致数据丢失或者溢出。解决方案:用,并且只用sizeof获得字长。为什么要用sizeof获得类型或变量的字长?因为变量的类型整型变量定义形式:
int变量表列;实型变量单精度定义形式:
float变量表列;具有6~7位有效数字双精度定义形式:
double变量表列;具有15~16位有效数字变量的类型整型变量阅读程序,给出运行结果#include<stdio.h>intmain(){ longx,y,z; x=-0xffffL;y=-0xffL;z=-0xffffffffL; printf("x=%6ldy=%6ldz=%6ld\n",x,y,z); x=-0xffff;y=-0xff;z=-0xffffffff; printf("x=%6ldy=%6ldz=%6ld\n",x,y,z); return0;}阅读程序,给出运行结果阅读程序,给出运行结果#include<stdio.h>intmain(){ shortintx; unsignedy; longz; x=65535; y=65535; z=65535; printf("x=%d\n",x); printf("y=%u\n",y); printf("z=%ld\n",z); return0;}它们在计算机中用二进制表示如下:变量x1111111111111111变量y00000000000000001111111111111111变量z00000000000000001111111111111111%d为基本整型输出格式说明符%u为无符号基本整型输出格式说明符%ld为长整型输出格式说明符阅读程序,给出运行结果它们在计算机中用二进制表示如下:%d为变量的类型字符型变量即可以存放字符型常量,也可以存放字符的ASCII码定义方式:
char变量表列;字符变量char(ASCII码值在0~255之间)与int数据间可进行算术运算例:a='D'; /*a=68;*/x='A'+5; /*x=65+5;*/s='!'+'G'; /*s=33+71;*/没有字符串变量,用字符数组存放变量的类型字符型变量例:a='D'; /*a=68;char型与int型之间的关系
//小写字母转换为大写字母#include
<stdio.h>intmain(){
char
ch='b';
printf("%c,%d\n",ch,ch);
ch='b'-32;
printf("%c,%d\n",ch,ch); return0;}b,98B,66
ch='b'-('a'-'A');char型与int型之间的关系//小写字母转换为大写字母b一个整型数据占4个字节,而字符型数据只占1个字节(只能存放0-255范围内的整数),因此,在将整型数据以字符形式输出时,只取低字节中的数据作为ASCII码字符输出。#include
<stdio.h>intmain(){ intx; x=1348; printf("x=%c\n",x); return0;}运行结果为:x=D1348在内存中为:00000000010001000000010100000000一个整型数据占4个字节,而字符型数据只占1个字节(只能存放0实型数据在内存中的存放形式实型数据在内存中按数据的指数形式存储,一般分三个部分:1)数符(s):0代表正,1代表为负2)指数部分(e):存储科学计数法中的指数数据,并采用指数移位存储。n位指数位能表示0-(2n-1),为了表示负指数,采用减个偏移量,如减(2n-1-1)来实现负指数的表示。而存储时则用实际指数值加偏移量如(2n-1-1)来存入指数部分,这就是指数移位存储。3)小数部分(f):存放数据科学计数法中的小数数字部分。实型数据在内存中的存放形式实型数据在内存中按数据的指数形式存1)float遵从的是IEEER32.24—指数部分占8位,小数部分占23位2)double遵从的是R64.53—指数部分占11位,小数部分占52位实型数据在内存中的存放形式注意:小数部分占的位(bit)数越多,数的有效数字越多,精度越高。指数部分占的位数越多,则能表示的数值范围越大。1)float遵从的是IEEER32.24—指数部分占8位将一个float型转化为内存存储格式的步骤1)先将该实数的绝对值转化为二进制格式。
2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
3)从小数点右边第一位开始数出23位数字放入第22位到第0位。
4)如果实数是正的,则在第31位放入"0",否则放入"1"。
5)指数部分第30到第23位的值为:
n+127(偏移量)对应的二进制代码(如果n是左移得到的);或
127(偏移量)-n对应的二进制代码(如果n是右移得到的)。
将一个float型转化为内存存储格式的步骤1)先将该实数的绝实型数据在内存中的存放形式实型数据在内存中的存放形式1)将第22位到第0位的二进制数写出来,在最左边补一位"1",得到24位有效数字。将小数点点在最左边那个"1"的右边。
2)取出第30到第23位所表示的值n,并减去127(偏移量),即为指数。
3)将小数点左移n位(当30位是"0"时)或右移n位(当30位是"1"时),得到一个二进制表示的实数。
4)将这个二进制实数化为十进制,并根据第31位是"0"还是"1"加上正号或负号即可。将一个float型二进制格式转化为十进制的步骤1)将第22位到第0位的二进制数写出来,在最左边补一位"1"实型数据在内存中的存放形式例:给出如下单精度存储的内存数据(32位):01000010111100010000000000000000,还原该单精度十进制数据。首先将该数据分成三段(1位、8位、23位),在内存中的存储就为下图所示:数值部分:1.1110001指数部分:133-127=6(1.1110001*26)2=(1111000.1)2=(120.5)10数值符号实型数据在内存中的存放形式例:给出如下单精度存储的内存数据(实型数据提供的有效数字位数//阅读程序,给出运行结果#include
<stdio.h>intmain(){
float
a;
double
b; a=33333.33333; b=33333.33333333333333;
printf("a=%f\nb=%f\n",a,b); return0;}实型数据提供的有效数字位数//阅读程序,给出运行结果由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。如下例:#include<stdio.h>intmain(){ floata,b; a=123456.789e5; b=a+20; printf("a=%f\n",a); printf("b=%f\n",b); return0;}说明:从运行结果看,误差明显。注意:1.0/3*3的结果并不精确等于1。由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总自动类型转换同种数据类型的运算结果,还是该类型不同种数据类型的运算结果,是两种类型中取值范围更大的那种longdouble>double>float>long>int>short>chardoublelongunsignedintchar,short精度低精度高float说明:必定的转换运算对象类型不同时转换自动类型转换同种数据类型的运算结果,还是该类型doublel自动类型转换
特别需要说明的是,在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后再运算。例charch;inti;floatf;doubled;ch/i+f*d-(f+i)intdoubledoubleintdoubledoubledoubledouble自动类型转换特别需要说明的是,在混合运算过程中例:自动类型转换示例,给出运行结果#include<stdio.h>intmain(){ floatx,y; shortm; longn; x=3/2+8/3; y=3.0/2+8/3.0; m=1*2*3*4*5*6*7*8*9; n=1l*2*3*4*5*6*7*8*9; printf("x=%f,y=%f\nm=%d,n=%ld\n",x,y,m,n); return0;}运行结果:x=3.000000,y=4.166667m=-30336,n=362880例:自动类型转换示例,给出运行结果运行结果:自动类型转换把数据赋值给另外一种类型变量会发生自动类型转换将取值范围小的类型转为取值范围大的类型是安全的反之是不安全的如果大类型的值在小类型能容纳的范围之内,则平安无事但是,浮点数转为整数,会丢失小数部分,非四舍五入反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关。避免如此使用,好的编译器会发出警告。自动类型转换把数据赋值给另外一种类型变量会发生自动类型转换赋值运算符与赋值表达式简单赋值运算符符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量例a=3;d=func();c=d+2;赋值运算符与赋值表达式简单赋值运算符例a=3;赋值运算符与赋值表达式复合赋值运算符符号:+=-=*=/=%=<<=>>=&=^=|=含义:exp1op=exp2exp1=exp1opexp2n=n+2;n+=2;x*=y+8;x=x*
(y+8);x%=3;x=x%
3;赋值运算符与赋值表达式复合赋值运算符n=n+2;n赋值运算符与赋值表达式说明:结合方向:自右向左左侧必须是变量,不能是常量或表达式赋值转换规则使赋值号右边表达式值自动转换成其左边变量的类型例
3=x-2*y;a+b=3;例floatf;inti;i=10;f=i;则
f=10.0例inti;i=2.56;/*结果i=2;*/赋值运算符与赋值表达式说明:例3=x-2*y;例floa赋值运算符与赋值表达式赋值表达式的值与变量值相等,且可嵌套。a=b=c=5a=5+(c=6)a=(b=10)/(c=2)/*表达式值为5,a,b,c值为5*//*表达式值11,c=6,a=11*//*表达式值5,a=5,b=10,c=2*/a=12;a+=a-=a*a/*a=-264等价于a=a+(a=a-(a*a))*/inta=2;a%=4-1;a+=a*=a-=a*=3;/*a=0等价于a=a+(a=a*(a=a-(a=a*3)))*/赋值运算符与赋值表达式赋值表达式的值与变量值相等,且可嵌套。例:阅读程序,写出结果并演算#include<stdio.h>intmain(){ inta=10,b=10; printf("%d\t",a+=a-=a*a); printf("%d",b+=b-=b*=b); return0;}举一反三:计算a=3时,a*=4+(a%=2)的结果。a=5a=-180b=0赋值运算符与赋值表达式例:阅读程序,写出结果并演算举一反三:a=5a=-180算术运算符与算术表达式表达式:由运算符、操作数(常量、变量、函数调用)和圆括号组成的式子。表达式的书写形式:中缀式:a+b后缀式:ab+前缀式:+ab例如:inta=1;intb=3;intc=0;c=(-a*b+c+67)*56;算术运算符与算术表达式表达式:由运算符、操作数(常量、变量、算术运算符与算术表达式算术运算符:+-*/%++--加、减、乘、除、求余运算自加自减四则混合运算中,先算乘除,后算加减,按从左向右的顺序计算,左结合优先级:
-++--
---->*/%
----->
+-(2)(3)(4)常用的标准数学函数算术运算符与算术表达式算术运算符:常用的标准数学函数算术运算符与算术表达式说明:"-"可为单目运算符时,右结合性C语言规定,两整数相除,结果为整数%要求两侧均为整型数据例:5/2 =-5/2.0=例
5%2=-5%2=1%10=5%1=5.5%2=2-2.51-110()算术运算符与算术表达式说明:例:例5%2=2-2.51算术运算符与算术表达式算术表达式指用算术运算符将运算对象连接起来的式子对于算术表达式要注意以下几个问题:1)注意表达式中各种运算符的运算顺序,必要时应加括号,例如,(a+b)/(c+d)≠a+b/c+d。2)注意表达式中各运算对象的数据类型,特别是整型相除。例如,
7/6的值为1;4/7的值为0;
(1/2)+(1/2)的值为0,而不是1。算术运算符与算术表达式算术表达式指用算术运算符将运算对象连接增一和减一运算符n++(后缀),n--,(前缀)++n,--n++让参与运算的变量加1,--让参与运算的变量减1作为后缀运算符时,先取n的值,然后加/减1作为前缀运算符时,先加/减1,然后取n的值n=n++;n=n;n++;增一和减一运算符n++(后缀),n--,(前缀)++n,--增一和减一运算符n++,n--,++n,--n++让参与运算的变量加1,--让参与运算的变量减1作为后缀运算符时,先取n的值,然后加/减1作为前缀运算符时,先加/减1,然后取n的值m=++n;n++;m=n;增一和减一运算符n++,n--,++n,--nm=++n增一和减一运算符例
i=3;printf("%d",-i++);printf("%d",i);++--不能用于常量和表达式,如5++,(a+b)++++--结合方向:
自右向左-(i++)注意-34例inti=3;printf("%d,%d",-i++,i);-3,3说明printf函数的输出项扫描顺序是自右向左的。增一和减一运算符例++--不能用于常量和表达式,如5+//阅读程序,给出运行结果#include<stdio.h>intmain(){ inta=1,b=1; printf("++a=%d,b++=%d\n",++a,b++); printf("a=%d,b=%d\n",a,b); printf("--a=%d,b--=%d\n",--a,b--); printf("a=%d,b=%d\n",a,b); return0;}运行结果:++a=2,b++=1a=2,b=2--a=1,b--=2a=1,b=1//阅读程序,给出运行结果运行结果:逗号运算与逗号表达式分隔符一个变量说明语句可以同时定义多个相同类型的变量,这些变量之间就用逗号来分隔。如:intx,y,z;函数参数表中各参数之间也是用逗号来分隔的。printf("x=%d\ny=%d\nz=%",x,y,z);运算符顺序求值运算符结合性从左向右逗号运算与逗号表达式分隔符逗号运算与逗号表达式逗号表达式的格式:表达式1,表达式2,…,表达式n求解次序:按从左到右的顺序分别计算各子表达式的值逗号表达式的值:等于表达式n的值多数情况下,并不使用整个逗号表达式的值,更常见的情况是要分别得到各表达式的值主要用在循环语句中,同时对多个变量赋初值等
for(i=1,j=10;i<j;i++,j--)循环起始条件循环结束条件循环增量逗号运算与逗号表达式逗号表达式的格式:循环起始条件循环结束条例:阅读程序,给出运行结果#include<stdio.h>intmain(){ intx,y=7; floatz=4; x=(y=y+6,y/z); printf("x=%d\n",x); return0;}运行结果:x=3逗号运算与逗号表达式例:阅读程序,给出运行结果运行结果:x=3逗号运算与逗号表达阅读程序,给出运行结果intmain(){ inta=3,b=4,c=1,max,t; if(a>b,a>c)max=a; elsemax=0; t=(a+3,b+1,++c); printf("max=%d,t=%d\n",max,t); return0;}运行结果:max=3,t=2逗号运算与逗号表达式举一反三:判断输出结果printf("%d,%d\n",(3,4,5),(a=3,a=0,a+=2));运行结果:5,2阅读程序,给出运行结果运行结果:max=3,t=2逗号运算与逗号运算与逗号表达式逗号运算符是所有运算符中级别最低的一种运算符。例如,下面两个表达式的意义是不同的:①x=3+4,5+7,10*4②x=(3+4,5+7,10*4)一个逗号表达式又可以与另一个表达式(可以是逗号表达式,也可以不是逗号表达式)连接成新的逗号表达式。(a=2*4,a*5),a-3最后得到整个逗号表达式的值为5。逗号运算与逗号表达式逗号运算符是所有运算符中级别最低的一种运运算符的优先级与结合性表达式的运算次序:取决于表达式中各种运算符的优先级。优先级高的运算符先运算,优先级低的运算符后运算。运算符的结合性:决定了并列的相同运算符的先后执行顺序。C语言规定了运算符的优先级和结合性使用圆括号可以提高括在其中的运算的优先级。运算符的优先级与结合性表达式的运算次序:取决于表达式中各种运运算符的优先级与结合性高低运算符的优先级与结合性高低运算符的优先级与结合性(续)高低运算符的优先级与结合性(续)高低混合运算时数据类型的转换当表达式中出现了多种类型数据的混合运算时,需要进行类型转换。隐含转换(自动转换):从占用内存较少的短数据类型转化成占用内存较多的长数据类型时,可以不做显式的类型转换声明。强制类型转换:从较长的数据类型转换成较短的数据类型时,要做强制类型转换。
混合运算时数据类型的转换当表达式中出现了多种类型数据的混合运例如:longlVal=1000;intival=200;lVal=ival;doubled1=123.5f;基本类型数据占有的内存宽度例如:基本类型数据占有的内存宽度混合运算时数据类型的转换1.隐含转换(自动类型转换)的规则:char,short,int,unsigned,long,unsignedlong,float,double低高混合运算时数据类型的转换1.隐含转换(自动类型转换)的规则混合运算时数据类型的转换2.强制类型转换,消除从大到小的警告l=(long)i;格式:(类型)表达式作用:把表达式的值转为任意类型,从而将数据范围宽的数据转换成范围低的数据,但这可能会导致溢出或精度的下降。
混合运算时数据类型的转换2.强制类型转换,消除从大到小的警例:(int)(x+y)(int)x+y(double)(3/2)(int)3.6用途:满足一些运算对类型的特殊要求,例"%",两侧为int(int)2.5%3防止丢失整数除法中的小数部分,例
intx=3,y=2;floatf;f=(float)x/y;混合运算时数据类型的转换例:(int)(x+y)(int)//阅读程序,给出运行结果#include
<stdio.h>intmain(){
int
m=5;
printf("m/2=%d\n",m/2);
printf("(float)(m/2)=%f\n",(float)(m/2));
printf("(float)m/2=%f\n",(float)m/2);
printf("m=%d\n",m); return0;}两个整数运算的结果还是整数,不是浮点数说明:强制转换得到所需类型的中间变量,原变量类型不变m/2=2(float)(m/2)=2.000000(float)m/2=2.500000m=5//阅读程序,给出运行结果两个整数运算的结果还是整数,不是浮例:阅读程序,给出运行结果intmain(){ floatx; inti; x=3.6; i=(int)x; printf("x=%f,i=%d",x,i); return0;}精度损失问题较高类型向较低类型转换时可能发生结果:x=3.600000,i=3混合运算时数据类型的转换例:阅读程序,给出运行结果精度损失问题较高类型向较低类型结果例:编写程序计算a+3*-2/(int)(a+b)-12的值。其中a=1.7,b=2.4#include<stdio.h>intmain(){ floata=1.7,b=2.4,s; s=a+3*-2/(int)(a+b)-12; printf("resultis%f\n",s); return0;}resultis–11.300000思考:x=3.0,y=4计算1/2*x+20%3*(x=y)/16的值0.5例:编写程序计算a+3*-2/(int)(a+b)-12的值变量的命名规则数据类型char,short,int,long,float,double,longdoublesigned,unsigned常量、转义字符运算符算术、增一/减一、赋值运算符、类型强转、逗号、sizeof类型转换优先级和结合性这一章我们学习了变量的命名规则这一章我们学习了第3章
数据类型及其运算第3章
数据类型及其运算C程序结构基本数据类型、变量与常量赋值运算符与赋值表达式算术运算符与算术表达式逗号运算与逗号表达式
运算符的优先级与结合性混合运算时数据类型的转换主要内容C程序结构主要内容C程序结构例3-1从键盘输入半径,求圆的周长和面积。算法思路:radius:存放从键盘输入的半径;
计算周长:perimeter=2*PI*radius;
计算面积:area=PI*radius*radius;输出perimeter和area的值不确定性列公式C程序结构例3-1从键盘输入半径,求圆的周长和面积。算法思#include<stdio.h>doublePI=3.14;intmain(){ intradius; doubleperimeter,area; printf("Inputaradius:"); scanf("%d",&radius); perimeter=2*PI*radius; area=PI*radius*radius; printf("Theperimeteris%.2f,Theareais %.2f\n",perimeter,area); return0;}声明变量radius提示输入输入数据赋给radius计算周长和面积输出结果预处理命令全局变量声明函数定义#include<stdio.h>声明变量radius提示组成C源程序的三个要素(1)
预处理命令。C编译程序对源程序编译前,先由预处理器对预处理命令进行预处理。(2)全局声明。包括全局变量声明和函数原型声明。(3)函数定义。一个C语言程序必须有一个main函数。函数由一组语句组成。比语句更小的语法单位:表达式、变量、常量和关键字等。组成C源程序的三个要素(1)预处理命令。C编译程序对源程序#include<stdio.h>/*函数功能:计算两个整数相加之和入口参数:整型数据a和b
返回值:整型数a和b之和*/intAdd(inta,intb){ return(a+b);}intmain(){ intx,y,sum=0; printf("Inputtwointegers:"); scanf("%d%d",&x,&y); /*输入两个整型数x和y*/ sum=Add(x,y); /*调用函数Add计算x和y相加之和*/ printf("sum=%d\n",sum); /*输出x和y相加之和*/ return0;}#include<stdio.h>关键字(Keyword)又称为保留字,C语言预定的具有固定含义的一些单词例如:数据类型修饰符int,控制语句return等
autobreakcasecharcontinueconstdefaultdoubledo
elsefloatforifintlongNULLreturnswitchshort
signed
truethisunsignedvoidwhileC程序常见符号—关键字关键字(Keyword)autobreakcasC程序常见符号大小写的英文字母:A~Z,a~z数字字符:0~9特殊字符:
空格 ! % ^ & _(下划线) + * = - ~<
> / \ ' " ; . , ()
[] {}C程序常见符号大小写的英文字母:A~Z,a~zC程序常见符号—标识符标识符(Identifier)分系统预定义标识符和用户自定义标识符以字母和下划线开始,大小写敏感,最长32个字符。以大写字母、小写字母、下划线或数字0~9组成。直观,见名知意,便于记忆和阅读最好使用英文单词或其组合,忌使用汉语拼音不宜混淆如1与l,o与0不允许使用关键字作为标识符的名字int,float,for,while,if等C程序常见符号—标识符标识符(Identifier)例:判断下列标识符号合法性,并标出不合法的标示符。sum Sum M.D.John dayDate 3days student_name#33 lotus_1_2_3 chara>b _above $123M.D.John3days#33char$123a>bC程序常见符号—标识符例:判断下列标识符号合法性,并标出不合法的标示符。M.D.J运算符(Operator)34种,详见附录分隔符(Separator)空格、回车/换行、逗号等其它符号大花括号"{"和"}"
"/*"和"*/"、//是程序注释所需的定界符数据(Data)变量(Variable)常量(Constant)C程序常见的其他符号运算符(Operator)C程序常见的其他符号数据类型、常量和变量数据为什么要区分类型?不同类型的数据代表不同的数据表示形式合法的取值范围占用内存空间大小可参与的运算种类
数据类型、常量和变量数据为什么要区分类型?数据类型基本类型构造类型指针类型空类型整型实型(浮点型)字符型枚举类型数组类型结构体类型共用体类型单精度实型双精度实型基本整型长整型短整型无符号整型数据类型(DataType)数据类型基本类型构造类型指针类型空类型整型实型(浮点型)字符衡量数据类型所占空间大小的单位常用的单位如下:b,B,KB,MB,GB,TB
bit,中文叫法:位Byte,中文叫法:字节Kilobyte(KB),中文叫法:KMegabyte(MB),中文叫法:兆Gigabyte(GB),中文叫法:GTerabyte(TB),中文叫法:T1TB==
1,024GB1GB==
1,024MB1MB==
1,024KB1KB
==
1,024B1B==
8b衡量数据类型所占空间大小的单位常用的单位如下:1TB==如何衡量数据类型所占空间大小?一个位有多大?只能是"0"或者"1",这叫二进制一个字节有多大?保存一个字符(英文字母、数字、符号)ASCII(美国标准信息交换码)编码见附录A,常用字符与ASCII码对照表两个字节保存一个汉字GB编码可以表示0~255之间的整数如何衡量数据类型所占空间大小?一个位有多大?基本数据类型表3-1C的基本数据类型(32位机)基本数据类型表3-1C的基本数据类型(32位机)整型(integer)整型:有符号整数,允许取值为整数。如:123,567整型的分类:整型(int):占4个字节短整型(shortint):占2个字节,通常简写为short长整型(longint):占4个字节,通常简写为long数据类型修饰符整型(integer)整型:有符号整数,允许取值为整数。如:signed用来修饰char、int、short和long,说明他们是有符号的整数(正整数、0和负整数)。有符号数在计算机内以二进制补码形式存储的,最高位表示符号位(0为正数,1为负数)。一般缺省都是有符号的,所以这个修饰符通常省略。shortint型:最大:32767最小:-32768数据类型修饰符signedshortint型:最大:32767最小:-3unsigned用来修饰char、int、short和long,说明他们是无符号的整数(正整数和0)。无符号型在机内只能存放正数,最高位也来表示数值的。当数据占用同样内存位数时,无符号型数值范围比有符号数扩大一倍。数据类型修饰符unsigned
short
int型:最大:65535最小:0unsigned数据类型修饰符unsignedshort扩充的整型类型有符号基本整型[signed]int;无符号基本整型
unsignedint;有符号短整型[signed]short[int];无符号短整型
unsignedshort[int];有符号长整型[signed]long[int];无符号长整型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论