《C语言程序设计》课件-项目2:数据类型、运算符与表达式_第1页
《C语言程序设计》课件-项目2:数据类型、运算符与表达式_第2页
《C语言程序设计》课件-项目2:数据类型、运算符与表达式_第3页
《C语言程序设计》课件-项目2:数据类型、运算符与表达式_第4页
《C语言程序设计》课件-项目2:数据类型、运算符与表达式_第5页
已阅读5页,还剩85页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

C语言程序设计2.5数据类型CONTENTS01引例02数据类型目录【例1】在屏幕上输出英文短句“Programmingisfun.”程序代码:/*Output:"Programmingisfun."*/#include<stdio.h> intmain(void){ printf("Programmingisfun."); return0;}运行结果:Programmingisfun.

1引例如果需要在两行上输出文字,例1可以改写如下:#include<stdio.h>

intmain(void)

{ printf("Programmingisfun.\n"); /*输出文字后换行*/

printf("AndProgramminginCisevenmorefun!\n");

return0;

}

换行运行结果:Programmingisfun.AndProgramminginCisevenmorefun!

【例2】设球半径为r、球体积为v、球表面积为f,球体积和球表面积的计算公式如下:

输入半径,分别计算球体积和球表面积。

运行结果:体积为:33.510292,表面积为:50.265442#include<stdio.h>#definePI3.14159 intmain(){ intr; floatv,f; r=2; v=4.0*PI*r*r*r/3.0; f=4.0*PI*r*r; printf("体积为:%f,表面积为:%f\n",v,f); return0; }2C语言的数据类型构造类型数据类型指针类型空类型基本类型实型(浮点型)字符型整型数组类型结构体类型共用体类型枚举类型图1C语言的数据类型(1)基本类型还可以分解为其他类型,主要为整型、字符型和浮点型。(2)构造类型是根据已定义的一个或多个数据类型,用构造的方法来定义的。包括:数组类型、结构体类型、共用体类型和枚举类型。(3)指针是C语言中一种特殊的,同时又具有重要作用的数据类型。C语言程序设计2.6常量与变量常量与变量1、什么是变量【重点】2、cpu、内存条、Cfree与操作系统之间的关系3、变量为什么要初始化4、如何定义变量【重点】5、什么是进制6、常量在C语言中是如何表示的7、常量是以什么样的二进制代码存储在计算机中8、什么是字节9、什么是ASCII码【重点】内存100321在程序运行过程中,其值可以被改变的量称之为变量#include"stdio.h"voidmain(){ intp; p=100; printf("%d\n",p); p=321; printf("%d\n",p);}给变量赋值,除了给一个直接的值以外,还可以通过计算获得1、什么是变量1、什么是变量变量的本质就是内存中的一段存储空间

方便找到一个和空闲内存单元一一对应的代码,避免了程序员自己去找空闲单元的编号,由操作系统完成.变量举例#include"stdio.h"main(){inti,j;i=5;j=i*6;printf("i=%d\n",i);printf("j=i*6=%d\n",j);}

定义两个变量inti,j:要求:给i赋值为5,给j赋值为i乘以6,打印输出i与j的值C语言中的变量命名规则在C语言中,变量命名需要遵循一定的规则有效名称principalcost_pricemarks_3lastnamecity无效名称123ratecurrency$discount%zipcode变量的命名规则:变量名可以由字母、数字和_(下划线)组合而成变量名不能包含除_以外的任何特殊字符,如:%、#、逗号、空格等变量名必须以字母或

_(下划线)开头变量名不能包含空白字符(换行符、空格和制表符称为空白字符)C语言中的某些词(例如double和float等)称为保留字,具有特殊意义,不能用作变量名C语言区分大小写,因此变量price与变量PRICE是两个不同的变量2、cpu、内存条、Cfree与操作系统之间的关系Cfree向操作系统请求在内存中开辟一段内存,Cfree再使用这些内存完成程序运行3、变量为什么要初始化所谓变量的初始化就是赋值的意思test.cpp(8):warningC4700:localvariable'i'usedwithouthavingbeeninitialized

test.obj-0error(s),1warning(s)VC6中运行结果:

i=-858993460#include<stdio.h>intmain(){ inti; printf(“i=%d\n”,i); return0;}4、如何定义变量

数据类型变量名=要赋的值;等价于 数据类型变量名; 变量名=要赋的值;举例子:inti=3; 等价于 inti;i=3;inti,j; 等价于 inti;intj;inti,j=4; 等价于 inti;intj;j=4;inti=3,j=4; 等价于 inti;intj;i=3;j=4;inti,j;i=j=5; 等价于 inti,j;i=5;j=5;5、什么是进制#include<stdio.h>intmain(void){ inti=1000; printf("%#X\n",i); return0;}//输出结果是:0X3E8二进制八进制十进制十六进制在计算机中一个数值可以用不同的进制形式来表示,但实际上,不管是哪种进制形式来表示,数值本身是不会发生变化的。因此,各种进制之间可以轻松地实现转换。6、常量在C语言中是如何表示的整数:十进制: 传统的写法十六进制: 前面加0x或0X八进制: 前面0注意是数字零不是字母o浮点数传统的写法: floatx=3.2;科学计数法: floatx=3.2e3;//x的值是3200floatx=123.45e-2;//x的值是1.23466、常量在C语言中是如何表示的字符单个字符用单引号括起来‘A’表示字符A‘AB’错误“AB”正确字符串用双引号括起来“A”正确,因为”A”代表了’A’’\0’的组合‘\0’是结束标记符号,表示字符串结束7、常量以什么样的二进制代码存储在计算机中整数以补码的形式转化为二进制代码存储在计算机中实数以IEEE754标准转化为二进制代码存储在计算机中(即在内存中以指数形式存储)字符的本质也是与整数的存储方式相同先通过ASCII码把字符转换为对应的整数,再按整数以补码形式转换为二进制

计算机将一个数值存放到内存前,会分别进行求原码、求反码、求补码这三步操作,最终将得到的机器数存入内存。数值求原码求反码求补码存放到内存7、常量以什么样的二进制代码存储在计算机中整数以补码的形式转化为二进制代码存储在计算机中实数以IEEE754标准转化为二进制代码存储在计算机中(即在内存中以指数形式存储)字符的本质也是与整数的存储方式相同先通过ASCII码把字符转换为对应的整数,再按整数以补码形式转换为二进制

反码与补码的出现就是为了解决以下问题:

•使符号位能与有效值部分一起参加运算,从而简化运算规则。•使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。8、什么是字节字节就是存储数据的单位,并且是硬件所能访问的最小单位1字节=8位1K=1024字节1M=1024K1G=1024M9、什么是ASCII码ASCII码不是一个值ASCII规定了不同字符用哪个整数值去表示它规定了

'A' --65 'B' --66 'a' --97 'b' --98 '0' --48代码的输出结果是?#include<stdio.h>intmain(void){ charch='A'; printf("%d\n",ch); return0;}10符号常量

在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:#define标识符常量值一个#define命令只能定义一个符号常量,若要定义多个符号常量,需使用多个#define命令。【例】某程序需要使用一个代表常数3.145的符号常量名xp,则以下定义中正确的是

。A.#definexp3.145;B.#definexp(3.145)C.#definexp=3.145D.#definexp3.145【例】已知某程序如下:#defineP2.5voidmain(){ printf("%f",P); }则main函数中标识符P代表的操作数是

。A.float型变量 B.double型变量C.float型常量 D.double型常量答案:D因为宏定义在程序运行过程中其值不可更改,直接进行对应的替换。【例】利用符号常量计算价格。

#include<stdio.h>#definePRICE20intmain(){ intnum,total; num=10; total=num*PRICE; printf("总价格为:%d\n",total);

return0;}运行结果:总价格为:200总结:符号常量的使用,可以为编写程序提供很多好处:增加程序的可读性。提高程序的可维护性。简化程序代码。方便数组的定义。C语言程序设计2.7算术运算符及其表达式C语言运算符与表达式表达式的概念:算术运算符:

Z=(X*2)+(5–Y)

表达式操作数操作数表达式表达式表达式运算符表达式的定义表达式由____和_____的组合而成表达式中的操作数可以是___、____或者_____运算符的主要类型有:算术运算符赋值运算符关系运算符逻辑运算符算术运算符(1)+-*/(除)%(取余数)除法运算符如:16/5==316.5/3==5.50000-13/4==-4

13/-3==43/5==05/3==1除法的运算结果和运算对象的数据类型有关:

两个数都是int,则商就是int,若商有小数,则截取小数部分;

被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点数,不截取小数部分。算术运算符(2)+-*/(除)

%(取余数)取模运算符如:13%3==113%-3==1-13%3==-1-13%23==-133%5==3取余%的运算对象必须是整数,结果是整除后的余数,其余的符号与被除数相同测试取模运算的例子#include<stdio.h>intmain(void){printf("%d%d%d%d%d%d\n",3%3,13%-3,-13%3,-13%-3,-13%23,3%5);return0;}01-1-1-133C语言程序设计2.8数据类型的转换数据类型转换C语言规定,不同类型的数据进行运算时要先转换成相同类型的数据才能进行运算。数据类型的转换可以分为自动转换和强制转换。1自动类型转换是由C语言编译系统自动完成的。进行自动转换的规则是:把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度。doublelongunsignedintfloatchar,short高低图1数据类型自动转换规则1自动类型转换说明:图中的横向箭头表示必定的转换。图中的纵向箭头表示当经过横向的转换后,进行运算的数据类型仍然不同时进行的转换方式。数据类型的各种转换只影响表达式的运算结果,并不改变原变量的定义类型,并且其数据值也不会发生任何改变。C99标准规定,long类型不能比普通类型短,short类型不能比普通类型长。图1数据类型自动转换规则1自动类型转换1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。2.转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。3.所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。4.char型和short型参与运算时,必须先转换成int型。5.在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。1自动类型转换自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:【例1】若有定义“doubled=153;inti=10;floatf=3.8;”,则表达式d+'a'+i*d/f的值的类型是_______。

分析:进行表达式“d+'a'+i*d/f”的运算时,根据自动转换规则:(1)将int型变量i和float型变量f转换为double型后,进行i*d/f的运算,结果为double型。(2)将char型常量'a'转换为int型,进行d+'a'的计算,此时“+”左右两边数据的类型不同,则再将int型转换为double型,进行加法运算,结果为double型。(3)将(1)的结果和(2)的结果进行加法计算,最终结果为double型。2强制类型转换采用强制类型转换运算符将某种数据类型强制转换成指定的数据类型,其一般形式为:

(类型说明符)(表达式)强制类型转换中的表达式一定要括起来,否则只对紧随其后的量进行类型转换;【例2】强制类型转换示例。#include<stdio.h>intmain(){ inta=3,b=4; floatc; c=(float)(a+b)/2; printf("c=%f\n",c); return0;}运行结果:c=3.500000说明:(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行类型转换。(2)强制类型转换是一种不安全的转换,如果是从高级类型转换成低级类型,则会损失数据的精度。(3)强制类型转换并不改变表达式中变量的类型和值。C语言程序设计2.9关系运算符1C语言对真假的处理非零是真

真是1表示零是假

假是0表示

数值1,是真数值-1,也是真只有0,才是假关系运算符用于对两个数值或变量进行比较,其结果是一个逻辑值(“真”或“假”)。2关系运算符运算符运算范例结果==相等于9==20!=不等于9!=21<

小于1<10>

大于1>01<=小于等于6<=30>=大于等于4>=31关系运算符程序举例>>=<<=!=(不等于)==(等于)//关系表达式最终值的测试#include<stdio.h>intmain(void){floatscore=0;inti=(90<=score<=100);printf("%d\n",i);return0;}//输出结果是多少?输出结果为:1C语言程序设计2.10逻辑运算符逻辑运算符用于判断数据的真假,其结果仍为“真”或“假”。逻辑运算符运算符运算范例结果&&与a&&b如果a和b都为真,则结果为真否则为假||或a||b如果a和b有一个或一个以上为真,则结果为真,二者都为假,结果为假!非!a如果a为假,则!a为真如果a为真,则!a为假逻辑运算符~真假~假真

真&&真真真&&假假假&&真假假&&假假

真||真真真||假真假||真真假||假假&&左边的表达式为假时,右边的表达式不执行||左边的表达式为真时,右边的表达式不执行如:intk=(3+2*4)&&(4-6)*5~(非)&&(并且)||(或)相当于:intk=(3+2*4)&&((4-6)*5)k的最终值为:1运算符||的使用#include<stdio.h>intmain(void){inti=10;intk=20;intm;

m=(1>2)||(k=5);

//8行,不含分号的是表达式

//含有分号的是语句

printf("m=%d,k=%d\n",m,k);return0;}运行结果是:m=1,k=5如果8行改为:m=(1>2)&&(k=5);

则输出结果为:m=0,k=20问题描述:接受用户输入的三种商品的价格。如果购买的三种商品中至少有一种商品的价格大于50或者三种商品的总额大于100,则折扣率为15%,否则折扣率为0,计算并显示用户应付的钱数。使用||运算符程序举例请输入第一种商品的价格:34请输入第二种商品的价格:42请输入第三种商品的价格:38折后总价为:96.90#include<stdio.h>voidmain(){floatrate1,rate2,rate3;doublediscount,total;printf("\n请输入第一种商品的价格:");

scanf("%f",&rate1);

printf("\n请输入第二种商品的价格:");

scanf("%f",&rate2);

printf("\n请输入第三种商品的价格:");

scanf("%f",&rate3);

total=rate1+rate2+rate3;

if((rate1>50)||(rate2>50)||(rate3>50)||(total>100)){

discount=0.15*total;

total=total-discount;

printf("\n折后总价为:%6.2f\n",total);

}

else

printf("\n总价为:%6.2f\n",total);}请输入第一种商品的价格:34请输入第二种商品的价格:42请输入第三种商品的价格:38折后总价为:96.90

if((rate1>50)||(rate2>50)||(rate3>50)||(total>100))运算符&&的使用inti=10;intk=20;intm,m2,m3;intk2=8;intk3=8;m=(3>2)&&(k=8);

//不含分号的是表达式,含有分号的是语句

m2=(3>2)&&(k2=0);m3=(3<2)&&(k3=0);printf("m=%dk=%d\n",m,k);printf("m2=%dk2=%d\n",m2,k2);printf("m3=%dk3=%d\n",m3,k3);运行结果是:m=1k=8m2=0k2=0m3=0k3=8问题描述:要求用户输入一个字符,用程序判断该字符是否为小写字母,并输出相应的信息。&&运算符程序举例请输入一个字符:T您输入的字符不是小写字母#include<stdio.h>voidmain(){

chara;

printf("\n请输入一个字符:");

scanf("%c",&a);

if(a>='a'&&a<='z')

printf("您输入的字符是小写字母\n",a);

else

printf("您输入的字符不是小写字母\n",a);}使用&&运算符内存numT请输入一个字符:T您输入的字符不是小写字母#include<stdio.h>voidmain(){intnum;printf("\n请输入一个数:");

scanf("%d",&num);

if(!(num%5))

printf("\n该数能被5整除

\n");

else

printf("\n该数不能被5整除

\n");}问题描述:确定用户输入的数字是否可以被5整除,并输出相应的消息。使用!运算符请输入一个数:90该数能被5整除C语言程序设计2.11三目运算符三目运算符有三个参与运算的表达式。也叫做条件运算符。?:一般形式:表达式1?表达式2:表达式3

先求解表达式1,如果表达式1的值为真,则整个表达式的值为表达式2的值;如果表达式1的值为假,则整个表达式的值是表达式3的值.例如:max=(a>b?a:b);//获得a、b中的较大值min=(a<b?a:b);//获得a、b中的较小值val=(val>=0?val:0

–val);//获得数val的绝对值三目运算符三目运算符“?”和“:”是一对运算符,不能分开单独使用;三目运算符的结合方向自右向左,例如a>b?a:c>d?c:d应该理解为a>b?a:(c>d?c:d)。//三目运算符

inta=10;intb=20;intresult=a>b;printf("result=%i\n",result);//如果我想获取两个数之间的最大数呢?

if(a>b){

printf("a和b之间最大数是%i\n",a);}else{

printf("a和b之间最大数是%i\n",b);}//可是上面的办法太麻烦了,x要写这么多行代码

intmaxNum=a>b?a:b;//如果a>b,那就返回a,如果a不大于b的话,那就返回b

printf("a和b之间最大数是%i\n",maxNum);三目运算符案例1//要求从控制台输入三个整数,然后返回最大的整数

printf("请输入三个整数以逗号隔开,回车结束\n");intnum1,num2,num3;scanf("%i,%i,%i",&num1,&num2,&num3);inttemp=num1>num2?num1:num2;//比较num1和num2中的最大值

intmaxNum=temp>num3?temp:num3;//拿到num1和num2的最大值再与num3做比较,返回最大值

printf("num1,num2,num3之间的最大值是:%i\n",maxNum);intmaxNum1=(num1>num2?num1:num2)>num3?(num1>num2?num1:num2):num3;//不推荐这种写法是因为,问号之前计算了一次num1和num2的最大值,问号表达式之后又计算了一次,无疑消耗了性能

printf("num1,num2,num3之间的最大值是:%d\n",maxNum1);三目运算符案例2C语言程序设计2.12位运算符位运算符是针对二进制数的每个二进制位进行运算的符号,它是专门针对数字0和1进行操作的。2.12位运算符运算符运算范例结果&按位与0&000&101&111&00|按位或0|000|111|111|01~取反~01~10^按位异或0^000^111^101^01<<

左移00000010<<20000100010010011<<201001100>>

右移01100010>>20001100011100010>>211111000

运算规则:将两个操作数二进制位中的对应位相与,当对应位都为1时结果为1,否则结果为0。例如:9&5

9: 0000000000001001& 5: 0000000000000101 0000000000000001对应的是1的补码,因此9&5=1。按位与运算通常用来对某些位清0或保留某些位。例如把a的高八位清0保留低八位,可作a&255运算(255的二进制数为0000000011111111)。1按位“与”运算符&

【例1】从键盘输入一个短整型整数,判断其最高位(即整数二进制表示的最左边一位)是0还是1,若为0则输出“正数”,若为1则输出“负数”。运行结果:请输入x的值:-12345-12345是负数

运算规则:将两个操作数二进制位中的对应位相或,对应位都为0时结果为0,否则结果为1。例如:9|5

9: 0000000000001001 | 5: 0000000000000101 0000000000001101对应的十进制为13,因此9|5=13。按位或运算符常用来对一个数据的某些位置1。2按位“或”运算符|运算规则:将两个操作数二进制位中的对应位相异或,对应位相同时结果为0,不同时结果为1。例如9^5,可写算式如下:

9: 0000000000001001 ^ 5: 0000000000000101 0000000000001100对应的十进制为12,因此9^5=12。使用异或运算符可以使一个数二进制表示的某些位反转,即将该数某些位由1变为0,由0变为1。3按位“异或”运算符^

【例2】编程实现将一个短整型数的低8位进行反转操作。运行结果:请输入x的值:26x=26,y=255,z=229注意此处,只有低8位进行了反转,也就是0变成了1,1变成了0,而高8位是保持不变的运算规则:将操作数的各二进制位按位取反,将0变为1,将1变为0。例如:~9

~0000000000001001 1111111111110110对应的是-10的补码,因此~9=-10。按位求反运算符可以和其他运算符结合起来使用以达到一些特殊的效果,例如,如果让一个整数x的最低位为零,可以表示为:x&~1。4按位“取反”运算符~运算规则:将一个操作数的二进制表示形式按指定的移位次数向左移动,移出的高位丢掉,空出的低位补0。例:a<<4是指把a的各二进位向左移动4位。进行左移运算时,如果左移时舍弃的高位中不包含1,左移1位右端补1个0,数据将扩大1倍,因此每左移1位相当于乘以2。5.1左移运算符<<5移位运算符包括<<(左移运算符)、>>(右移运算符),都是双目运算符。运算规则:将一个操作数的二进制表示形式按指定的移位次数向右移动,移出的低位丢掉,空出的高位,根据操作数的类型来定。例如:“inta=-23;unsignedb=65;”a>>2:-23=>1111111111101001

>>2=>1111111111111010=>-6

即a>>2=-6

例如:“inta=-23;unsignedb=65;”b>>2:65=>0000000001000001

>>2=>0000000000010000=>16

即b>>2=16

5.2右移运算符>>说明:进行右移运算时,对于正数,右移1位,实际数值减小1倍,即每右移1位相当于除以2。此结论只用于右移时舍弃的低位中不包含1的情况。

【例3】测试计算机系统的C编译器是逻辑右移还是算术右移。运行结果:

算术右移C语言程序设计2.13运算符优先级运算符的优先级1当我们遇到一个复杂表达式时,需要确定先执行哪种运算,此时就需要考虑运算符的优先级z=x+y–g*h*

(t/20)+65–r%2先算哪部分加?减?取余?除?括号?要解决此问题,需要使用:运算符优先级在对一些比较复杂的表达式进行运算时,要明确表达式中所有运算符参与运算的先后顺序,我们把这种顺序称作运算符的优先级。运算符的优先级2优先级运算符结合性1.[]()自左向右2++--~!(数据类型)自右向左3*/%自左向右4+-自左向右5<<>>>>>自左向右6<><=>=自左向右7==!=自左向右8&自左向右9^自左向右10|自左向右11&&自左向右12||自左向右13?:(三目运算符)自右向左14=*=/=%=+=-=<<=>>=>>>=&=^=|=自右向左优先级规律:算术>关系>逻辑>赋值,即算术运算符的优先级高于关系运算符。在优先级相同的情况下,按规定的“结合方向”进行处理。运算符的结合性附录的一些琐碎的运算符知识(1)1.自增自减运算符作用是使变量的值增1或减1例如:++i;--i;在使用i之前,先使i的值加/减1i++;i--;在使用i之后,使i的值加/减1i++与++i的区别++i是先执行i=i+1后,再使用i的值;i++是先使用i的值后,再执行i

温馨提示

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

评论

0/150

提交评论