数据类型运算符和表达式演示文稿_第1页
数据类型运算符和表达式演示文稿_第2页
数据类型运算符和表达式演示文稿_第3页
数据类型运算符和表达式演示文稿_第4页
数据类型运算符和表达式演示文稿_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

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

文档简介

数据类型运算符和表达式演示文稿目前一页\总数一百零四页\编于十四点内容提要基本数据类型;常量和变量;标识符命名;常用运算符和表达式;运算符的优先级与结合性目前二页\总数一百零四页\编于十四点Hello,World#include<stdio.h>main(){ printf("hello,world\n");}超级无敌考考你:

如何把“hello”和“world”分别打印在两行?hello.c目前三页\总数一百零四页\编于十四点例2.1:一个简单的C程序例子#include<stdio.h>/*函数功能:计算两个整数相加之和

入口参数:整型数据a和b

返回值:整型数a和b之和*/intAdd(inta,intb){ return(a+b);}/*主函数*/main(){ 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相加之和*/}并列的两个函数其中一个是程序的入口程序注释目前四页\总数一百零四页\编于十四点C程序常见符号分类关键字(Keyword)又称为保留字,C语言中预先规定的具有固定含义的一些单词数据类型修饰符int,控制语句return等标识符(Identifier)系统预定义标识符,main,printf等

用户自定义标识符,Add,x,y

等运算符(Operator)34种,详见附录2

分隔符(Separator)空格、回车/换行、逗号等其它符号大花括号“{”和“}”通常用于标识函数体或者一个语句块“/*”和“*/”是程序注释所需的定界符数据(Data)变量(Variable)常量(Constant)目前五页\总数一百零四页\编于十四点标识符命名作用是用来给变量、函数、类型等起名字的,以便于区分。定义是以字母或下划线开头,后跟若干字母、下划线或数字。大小写敏感正确:abc_abca11a12_a12ABC_23AbcA_2不正确:232ANo.A-2目前六页\总数一百零四页\编于十四点标识符命名直观,见名知意,便于记忆和阅读SUM、MAX、NODE最好使用英文单词或其组合切忌使用汉语拼音下划线和大小写通常用来增强可读性variablenamevariable_namevariableName不允许使用关键字作为标识符的名字

int,float,for,while,if等某些功能的变量采用习惯命名如:for语句所采用的循环变量习惯用i,j,kWindows风格UNIX风格P43,2.1目前七页\总数一百零四页\编于十四点基本数据类型数据为什么有类型之分?在程序中要处理大量的数据,对于数据来说,它们有着某些相同的属性,处理规律相同,存储格式、取值范围也相同。我们将具有相同属性的数据称为一类,即数据类型,符合计算机中数据的存储方式。学习任何语言,首先要学习其数据类型.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目前十页\总数一百零四页\编于十四点b,B,KB,MB,GB,TB一个位有多大?只能是“0”或者“1”,这叫二进制一个字节有多大?保存一个字符(英文字母、数字、符号)ASCII(美国标准信息交换码)编码见P427附录D,常用字符与ASCII码对照表两个字节保存一个汉字GB编码可以表示0~255之间的整数目前十一页\总数一百零四页\编于十四点基本数据类型int整数,在目前绝大多数机器上占4个字节。TC2中是2个字节VC中是4个字节float单精度浮点数,一般是4个字节长double双精度浮点数,一般是8个字节长char字符,一般是1个字节长用来表示256个ASCII字符,或者0~255的整数目前十二页\总数一百零四页\编于十四点数据类型修饰符shortshortint,短整数,一般2个字节长。通常简写为shortlonglongint,长整数,一般是4个字节长。通常简写为longlongdouble,长双精度(高精度)浮点数,一般是10个字节长。signed用来修饰char、int、short和long,说明他们是有符号的整数(正整数、0和负整数)。一般缺省都是有符号的,所以这个修饰符通常省略unsigned用来修饰char、int、short和long,说明他们是无符号的整数(正整数和0)目前十三页\总数一百零四页\编于十四点何谓类型溢出(Overflow)?C语言直接提供的任何类型都有取值范围。当向其赋超过此范围的数值,就会产生数值溢出,得到一个不正确的结果。vc中int的范围是-2^31~2^31-1如果超出取值范围,给它一个小于-2^31或者大于2^31的数会如何呢?小蛇能吞下大象吗?P292-7.c目前十四页\总数一百零四页\编于十四点溢出(Overflow)造成的危害一台安装了Windows95/98的机器,如果连续运行49.7天没有重新启动,可能死机原因:Windows自启动时刻起,有一个计数器,记录系统已经运行了多少毫秒。这个计数器是个unsigned

long类型的变量unsigned

long的最大值是:4294967295一天有24*60*60*1000=86400000毫秒4294967295/86400000=49.71026961805……当49.7天的时候,此计数器会溢出,引起死机目前十五页\总数一百零四页\编于十四点何谓类型溢出(Overflow)?生活中的例子:身份证号码中的出生年阿利亚娜号火箭发射失败现象与危害:溢出后的数值是可预料的,但不同平台会有所不同。当程序从高位计算机向低位计算机移植(比如从64位系统移植到32位系统)时,以前从不出现的溢出问题可能出现。目前十六页\总数一百零四页\编于十四点类型溢出的解决方案?解决方案:预先估算运算结果的可能范围,采用取值范围更大的类型。1+2+3+…1!+2!+3!+…13+23+33+…如果不需要处理负数,则采用无符号类型。在运算还没开始之前就判断运算数是否在合理的取值范围内。如果超出,则停止运算,转错误处理。目前十七页\总数一百零四页\编于十四点基本数据类型常量变量

在计算机中存储的数据,按存储的性质分,可分为:目前十八页\总数一百零四页\编于十四点常量(Constant)整型常量18、-31longint型常量123l、123L、123456l、123456Lunsignedint型常量123u、123U浮点常量十进制小数形式123.45、456.78指数形式1e-2、4.5e3float型常量123.45f、456.78F、1e-2f、4.5e3Flongdouble型常量123.45l、456.78L、4.5e3L缺省为double因为字母l和数字1容易混淆,所以当用l做后缀时,常使用大写形式目前十九页\总数一百零四页\编于十四点八进制与十六进制常量以数字“0”开始的整型常数是八进制数022、-037010和10大小不一样因为八进制并不常用,所以此种表示法比较少见以“0x”或者“0X”开始的整型常数是十六进制A~F和a~f用来表示十进制的10~15十六进制的形式比较常用0x12、-0x1F,-0x1f目前二十页\总数一百零四页\编于十四点TC.EXE中的一段16进制代码目前二十一页\总数一百零四页\编于十四点字符(Character)常量字符常量的表示方法’a’,’A’,’5’,’%’,’$’……单引号内只能有一个字符,除非用“\”开头就是一个普通整数,也可以参与各种数学运算每个字符具有一个0~255之间的数值,可从ASCII表查出注意:’5’和整数5的区别字符的数学运算在密码学内用得比较多用“\”开头的字符为转义字符例如,"\n",代表1个字符目前二十二页\总数一百零四页\编于十四点TheASCIIlettercodesLetterCodeLetterCodeLetterCodeLetterCodea01100001n01101110A01000001N01001110b01100010o01101111B01000010001001111c01100011p01110000C01000011P01010000d01100100q01110001D01000100Q01010001e01100101r01110010E01000101R01010010f01100110s01110011F01000110S01010011g01100111t01110100G01000111T01010100h01101000u01110101H01001000U01010101i01101001v01110110I01001001V01010110j01101010w01110111J01001010w01010111k01101011x01111000K01001011X01011000101101100y01111001L01001100Y01011001m01101101z01111010M01001101Z01011010目前二十三页\总数一百零四页\编于十四点字符常量转义字符一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示目前二十四页\总数一百零四页\编于十四点字符串(String)常量用双引号括住的由0个或多个字符组成的字符序列"Iamastring"""表示空字符串转义字符也可以在字符串中使用引号只作为字符串开始和结束的标志C语言内部用’\0’表示字符串的结束除注释外,是唯一可以出现中文的地方"x"和’x’是不同的<string.h>里定义了一系列专门的字符串处理函数目前二十五页\总数一百零四页\编于十四点字符串在内存中的存放方式在内存中每个字符按顺序存放字符串结尾有一个空字符(ASCII=0,'\0')作为字符串结束标志字符串结束标志'\0'是不能显示的,在字符串常量中,也不用显式写出来举例"TEST""""a"'T''E''S''T'\08469838400\0'a'\0009700由系统在字符串的末尾自动加一个‘\0’作为字符串的结束标志目前二十六页\总数一百零四页\编于十四点字符常量与字符串常量的区别字符常量和字符串常量是不同类型的数据定界符不同:字符常量使用单引号,而字符串常量使用双引号'a'与"a"是不同的字符常量只能是单个字符,字符串常量则可以含一个或多个字符不能把一个字符串赋值给一个字符型变量

chara,c;

a=‘A’; c=“A”;/*语句非法*/a\0a目前二十七页\总数一百零四页\编于十四点宏常量宏常量也称符号常量一般采用全大写字母表示#define

标识符字符串不是语句,而是一种编译预处理命令宏替换(MacroSubstitulition)P222.2目前二十八页\总数一百零四页\编于十四点为什么需要常量?要避免使用幻数直接使用的常数叫幻数。现象与危害:当常数需要改变时,要修改所有使用它的代码,工作量巨大,还可能有遗漏。解决方案:把幻数定义为宏、const常量,或者枚举常量。建议使用后两者。#defineARRAY_SIZE10constintARRAY_SIZE=10;enum{ARRAY_SIZE=10};目前二十九页\总数一百零四页\编于十四点例2.2:计算圆的周长和面积#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相当于执行#include<stdio.h>main(){ printf("area=%f\n",3.14159*5.3*5.3); printf("circumference=%f\n",2*3.14159*5.3);}目前三十页\总数一百零四页\编于十四点例2.2:计算圆的周长和面积#include<stdio.h>#definePI3.14159;#defineR5.3;main(){ printf("area=%f\n",PI*R*R); printf("circumference=%f\n",2*PI*R);}相当于执行#include<stdio.h>main(){ printf("area=%f\n",3.14159;*5.3;*5.3;); printf("circumference=%f\n",2*3.14159;*5.3;);}语法错误目前三十一页\总数一百零四页\编于十四点const常量用const修饰定义的变量为常量constfloatpi=3.1425926;

const常量与宏常量相比的优点是什么?const常量有数据类型某些集成化调试工具可以对const常量进行调试目前三十二页\总数一百零四页\编于十四点枚举(Enumeration)常量一个被遗忘的角色从程序来窥其一斑enumweeks{SUN,MON,TUE,WED,THU,FRI,SAT};enumweekstoday;enumresponse{no,yes,none};enumresponseanswer;today=TUE;answer=yes;

if(answer==yes)printf("TodayisTuesday.\n");elseprintf("TodayisNOTTuesday.\n");目前三十三页\总数一百零四页\编于十四点变量定义变量就是在程序执行过程中,其值可以改变的量。变量用来临时保存程序运行过程中的中间结果。目前三十四页\总数一百零四页\编于十四点变量

在程序中对变量的访问(存入,读取)都是通过变量名进行的。变量在内存占据存储空间,因此对变量也可以通过它在内存中的地址,即指向变量的指针进行。

7

abcdec=7x=c目前三十五页\总数一百零四页\编于十四点变量类型变量是存放常量值(数据)的,常量(数据)有类型之分,因而变量也有类型之分,变量类型是来确定其变量存储空间的长度和存储格式。原因目前三十六页\总数一百零四页\编于十四点变量类型类型说明一般格式:类型名变量名表;举例:

inti,j,I,count;shorta=‘y’,b;longl1,l2;unsignedn1,n2;charc1,c2,c3;floatx1,x2;doublew,y,z1,z2;目前三十七页\总数一百零四页\编于十四点变量类型注明变量必需先定义,后使用。变量分类整形变量浮点变量字符变量目前三十八页\总数一百零四页\编于十四点变量声明使用变量的基本原则变量必须先定义,后使用所有变量必须在第一条可执行语句前定义声明的顺序无关紧要一条声明语句可声明若干个同类型的变量声明变量,是初始化变量的最好时机不被初始化的变量,其值为危险的随机数 charesc='a'; inti=1; intsum=0; floateps=1.0e-5;目前三十九页\总数一百零四页\编于十四点定义变量的两个主要作用变量名标明数据在内存中的地址,在对程序进行编译连接时系统为每个变量名分配一个内存地址。声明类型的目的是告诉系统变量需要占用的存储单元数据,以便系统为变量分配存储单元。目前四十页\总数一百零四页\编于十四点Definingtheintegervariablenamedtotal目前四十一页\总数一百零四页\编于十四点变量的值可以在定义变量时获得,也可以在程序执行的过程中获得变量赋值的一般格式如下:变量名=表达式例如:y=x+6.9;注意:“=”并非指两侧相等,而是包含了计算和赋值两个过程。目前四十二页\总数一百零四页\编于十四点若没有定义变量直接在程序中使用变量:

student_num=30;则编译时会指出未定义错误。若程序中有:intstudent_num;/*变量定义*/::student_num=30;/*给变量赋值*/

则student_num变量是合法的。说明目前四十三页\总数一百零四页\编于十四点整形变量存储形式符号位数值部分整形变量分类标准整形(int)短整形(short)长整形(long)(与int相同)无符号整形(unsigned)目前四十四页\总数一百零四页\编于十四点整形(=长整形)定义格式定义举例int变量名表;longint变量名表;longinti,j,k;longn;目前四十五页\总数一百零四页\编于十四点整形(=长整形)取值范围当n=5时:当n=-5时:32位:-2^31~2^31-1inti=2147483647;目前四十六页\总数一百零四页\编于十四点实型变量定义格式定义举例变量性质float变量名表;double变量名表;floatc1,c2,c3;doublec4;类型比特数有效数字数值范围float326-7-3.4x10+38

~3.4x10+38double6415-16-1.7x10+308

~1.7x10+308目前四十七页\总数一百零四页\编于十四点浮点数据的机内表示:

阶码是整数,阶符和阶码的位数合起来反映浮点数的表数范围——表数范围,小数点的实际位置;尾数是小数,其位数反映了浮点数的精度——表数精度,尾数的符号代表浮点数的正负。

N=

S*10j浮点数分类单精度浮点数双精度浮点数目前四十八页\总数一百零四页\编于十四点实型数据提供的有效数字位数

p28例2.6#include<stdio.h>main(){ floata;

doubleb; a=123456.789e4; b=123456.789e4; printf("%f\n%f\n",a,b);}1234567936.0000001234567890.000000

float型数据提供7位有效数字double型数据提供16位有效数字使用不当导致舍入误差目前四十九页\总数一百零四页\编于十四点结论:由于实数存在舍入误差,使用时要注意:不要试图用一个实数精确表示一个大整数,记住:浮点数是不精确的。实数一般不判断“相等”,而是判断接近或近似。避免直接将一个很大的实数与一个很小的实数相加、相减,否则会“丢失”小的数。根据要求选择单精度、双精度。目前五十页\总数一百零四页\编于十四点字符变量定义格式定义举例变量性质char变量名表;charc1,c2,c3;charc4;一个字符变量在内存中占一个字节。字符变量只能存放一个字符。字符在内存中以ASCII码值的形式存储,因此可以象整数一样运算。注明不能把字符串常量赋给字符变量。charc1=‘a’;charc1="abcd";目前五十一页\总数一百零四页\编于十四点char型与int型之间的关系例2.5:小写字母转换为大写字母#include<stdio.h>main(){ charch='b';printf("%c,%d\n",ch,ch); ch='b'-32;

printf("%c,%d\n",ch,ch);}#include<stdio.h>main(){ charch='b';printf("%c,%d\n",ch,ch);

ch='b'-('a'-'A')

;

printf("%c,%d\n",ch,ch);}b,98B,66

b,98B,66

目前五十二页\总数一百零四页\编于十四点使用变量要注意不要对变量所占的内存空间字节数想当然用sizeof获得变量或者数据类型的长度注意!目前五十三页\总数一百零四页\编于十四点sizeof到底是什么?它是一个C语言的关键字,并不是函数可以用两种形式使用sizeof(表达式)一般都使用sizeof(变量名)sizeof(类型)求出的结果为表达式值所属类型或者类型占用的字节数现场演示程序例2.3P25,例2.3目前五十四页\总数一百零四页\编于十四点例2.3#include<stdio.h>main(){ printf("DatatypeNumberofbytes\n"); printf("---------------------------------\n"); printf("char%d\n",sizeof(char)); printf("int%d\n",sizeof(int)); printf("shortint%d\n",sizeof(short)); printf("longint%d\n",sizeof(long)); printf("float%d\n",sizeof(float));

printf("double%d\n",sizeof(double));}P25,例2.3目前五十五页\总数一百零四页\编于十四点为什么要用sizeof获得类型或变量的字长?因为同种类型在不同的平台其占字节数不尽相同。比如int在16位、32位和64位系统分别占2、4和8个字节。现象与危害:在平台间移植时会出现问题,导致数据丢失或者溢出。解决方案:用,并且只用sizeof获得字长。目前五十六页\总数一百零四页\编于十四点C语言中的运算计算机只会计算任何事物都要被表示成数字和公式的形式后,才能被计算机计算(被计算机处理)事物到数字和公式的转换过程叫数学建模因为:事物在计算机内的处理都是一种计算又因为:计算就要有操作数、运算法则和计算结果所以:事物在计算机内的处理都有操作数、运算法则和计算结果计算结果你可以留用,也可以忽略目前五十七页\总数一百零四页\编于十四点算术运算符+,-,*,/加、减、乘、除运算四则混合运算中,先算乘除,后算加减,

按从左向右的顺序计算,左结合%求余运算常用的标准数学函数函数名功能函数名功能sqrt(x)计算x的平方根,x应大于等于0exp(x)计算ex的值fabs(x)计算x的绝对值pow(x,y)计算xy的值log(x)计算lnx的值sin(x)计算sinx的值,x为弧度值log10(x)计算lgx的值cos(x)计算cosx的值,x为弧度值

以下函数的返回值均为双精度类型。目前五十八页\总数一百零四页\编于十四点算术运算的运算规则(1)0.负值运算符优先级高,结合性从右往左1.运算的优先顺序为先*、/、%,后+、-,同等优先级从左到右运算。举例:18*5/9

5/9*182.5*8.02.两个类型相同的操作数,运算结果类型也相同。——类型匹配的原则!!!目前五十九页\总数一百零四页\编于十四点算术运算的运算规则(2)3.两个类型不同的操作数,运算结果类型与其中类型较高的类型相同。举例:5.0/9*18

2.5*84.求余运算的运算结果其值为相除所得余数,而符号与被除数的符号相同。举例:-13%5=-313%(-5)=3目前六十页\总数一百零四页\编于十四点算术表达式定义用算术运算符将运算对象连接起来的式子。其中:运算对象包括常量、变量、函数等。举例a+bc+da+b/c+d(a+b)/(c+d)a+b2c(a+b)/2c(a+b)/2*c(a+b)/(2*c)cos45°+2ex

cos(45)+2*exp(x)cos(3.14*45/180)+2*exp(x)目前六十一页\总数一百零四页\编于十四点算术表达式的举例(lgx-lnx)121/2*[lg(x)-ln(x)]1/2*(lg(x)-ln(x))1.0/2*(log10(x)-log(x))0.5*(log10(x)-log(x))(log10(x)-log(x))/21.所有表达式必须以线性形式写出。2.只能使用合法的标识符3.乘号只能用*4.函数自变量可以是表达式且其必须写在括号内,三角函数的参数以弧度表示5.为指明正确的运算顺序,可以使用“()”,不能使用“[]”或“{}”。说明:1.0/2*(lg(x)-ln(x))目前六十二页\总数一百零四页\编于十四点赋值运算符(AssignmentOperators)赋值运算符=把右侧表达式的值赋给左侧的变量一般情况下,赋值运算符左侧只能是变量赋值运算符的优先级较低,“自右向左”结合运算符两侧类型不一致时,要进行类型转换转换原则是:先将赋值号右边表达式类型转换为左边变量的类型,然后赋值。目前六十三页\总数一百零四页\编于十四点赋值运算符(AssignmentOperators)赋值表达式的求解过程:先计算赋值运算符右侧的表达式的值将赋值运算符右侧的表达式的值赋给左侧的变量整个赋值表达式的值就是刚才所赋的值。赋值的含义:将赋值运算符右边的表达式的值存放到左边变量名标识的存储单元中。注意“赋值”与“等于”的区别:赋值符号“=”不同于数学的等号,它没有相等的含义。(“==”相等)例i=i+2;目前六十四页\总数一百零四页\编于十四点赋值运算符:=赋值表达式一般形式:

变量=表达式例:a=5;/*表达式的值为5*/a=b=3;/*a=(b=3)*/a=b=c=1;/*a=(b=(c=1))*/a=(b=4)+(c=3);/*b=4,c=3,a=7*/注意:赋值运算符按自右而左的结合顺序目前六十五页\总数一百零四页\编于十四点复合赋值运算符=前加上算术运算符或位运算符如+=,-=,*=,/=,%=……复合赋值表达式一般形式:

<变量><双目运算符>=<表达式>

等价于:<变量>=<变量><双目运算符><表达式>举例,z*=x+y; /*z=z*(x+y);*/n+=1等价于n=n+1x*=y+1等价于x=x*(y+1)注意:赋值运算符、复合赋值运算符的优先级比算术运算符低。设有:floata=2.;问:a/=3*5.;等价于a=a/(3*5.);等价于a=a/3*5.吗?;P43,2.2(7)目前六十六页\总数一百零四页\编于十四点main(){inta=12,n=5;/*2-10.c*/a+=a;printf("a+=a:a=%d\n",a);/*a=24*/a-=a-2;printf("a-=a-2:a=%d\n",a);/*a=2*/a*=3+2;printf("a*=3+2:a=%d\n",a);/*a=10*/a/=a+a;printf("a/=a+a:a=%d\n",a);/*a=0*/a%=n%=2;printf("a%%=n%%=2:a=%d\n",a);/*a=0*/a+=a-=a*=a;printf("a+=a-=a*=a:a=%d\n",a);/*a=0*/}目前六十七页\总数一百零四页\编于十四点关系运算符>,>=,<,<=,==,!=大于,大于等于,小于,小于等于,等于,不等于关系运算符运算出的结果为0和非00,表示假,即该关系不成立非0,表示真,即该关系成立在所有涉及到真假判断的地方,0表示假,非0表示真目前六十八页\总数一百零四页\编于十四点关系运算符(RelationalOperators)运算符名称举例优先级(算术运算符)<小于i<100高<=小于等于a<=MAX>大于f>3.14>=大于等于c>='a'==等于a==b低!=不等于x!=0(赋值运算符)注意:在C语言中,“等于”关系运算符是双等号“==”,而不是单等号“=”(赋值运算符)目前六十九页\总数一百零四页\编于十四点找别扭inta=1;

if(a==0)

printf("OK");inta=0;

if(a==0)

printf("OK");inta=1;

if(a=0)

printf("OK");inta=0;

if(a=0)

printf("OK");目前七十页\总数一百零四页\编于十四点==和=inta;

a=0;

a==1;inta;

a==0;

a=1;一定要分清==和=下面用法能起点小作用:inta=0;

if(0==a)

printf("OK");inta=0;

if(0=a)

printf("OK");编译出错目前七十一页\总数一百零四页\编于十四点

例如,假设num1=3,num2=4,num3=5,则:(1)num1>num2的值=0。(2)(num1>num2)!=num3的值=1。(3)num1<num2<num3的值=1。思考题:任意改变num1或num2的值,会影响整个表达式的值吗?为什么?(4)(num1<num2)+num3的值=6,因为num1<num2的值=1,1+5=6。再次强调:C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。所以,关系表达式的值,还可以参与其它种类的运算,例如算术运算、逻辑运算等。目前七十二页\总数一百零四页\编于十四点例若a=0;b=0.5;x=0.3;

则a<=x<=b的值为0例5>2>7>8在C中是允许的,值为0例inti=1,j=7,a;a=i+(j%4!=0);

则a=2例‘a’>0结果为‘A’>100结果为10目前七十三页\总数一百零四页\编于十四点逻辑运算符逻辑运算也被称为布尔(Boolean)运算与运算&&a&&b当且仅当两者都为真,则结果为真(a>b&&b>c);a大于b,并且b大于c或运算||a||b只要两者中有一个为真,结果就为真(a>b||b>c);a大于b,或者b大于c求反!(!a);如果a是0,结果非0;如果a是非0,结果是0并不改变a的值目前七十四页\总数一百零四页\编于十四点逻辑运算符(LogicalOperators)运算符名称举例优先级!逻辑非!(a>b)(算术运算符)(关系运算符)&&逻辑与(x>y)&&(y>z)||逻辑或(x>3)||(x<-3)(赋值运算符)目前七十五页\总数一百零四页\编于十四点实例ch是英文大写字母(ch>='A')&&(ch<='Z')判断某一年year是否是闰年的条件是满足下列两个条件之一:能被4整除,但不能被100整除;能被400整除;((year%4==0)&&(year%100!=0))||(year%400==0)目前七十六页\总数一百零四页\编于十四点逻辑表达式求值特点逻辑表达式中的运算符,只有会影响表达式求值时,才会执行a&&b&&c只有a为非0时才计算b的值;只有a和b都为非0时才计算c的值;

a||b||c只有a为非0时就不必计算b和c;只有a为0时才计算b的值;只有a和b都为0时才计算c的值例,intx,y,z;x=y=z=0;x++&&++y||z++;例,intx,y,z;x=y=z=-1;++x||y++&&++z;目前七十七页\总数一百零四页\编于十四点增一和减一运算符n++,n--,++n,--n++让参与运算的变量加1,--让参与运算的变量减1作为后缀运算符时,先取n的值,然后加/减1作为前缀运算符时,先加/减1,然后取n的值n=n++;n=n;n++;目前七十八页\总数一百零四页\编于十四点增一和减一运算符n++,n--,++n,--n++让参与运算的变量加1,--让参与运算的变量减1作为后缀运算符时,先取n的值,然后加/减1作为前缀运算符时,先加/减1,然后取n的值n=++n;n++;m=n;目前七十九页\总数一百零四页\编于十四点自增、自减运算符举例inti=3,j,a,b=1,c=2;j=++i; /*i=i+1,j=i,i=4,j=4*/j=i++; /*j=i,i=i+1,i=5,j=4*/j=-i++; /*-(i++),i=6,j=-5*/j=i++*2; /*(i++)*2,i=7,j=12*/a=(b+c)++; /*非法!!!

*/a=34++; /*非法!!!

*/j=++i++; /*非法!!!

*/目前八十页\总数一百零四页\编于十四点增一和减一运算符良好的程序设计风格提倡:在一行语句中,一个变量只能出现一次加1或者减1运算过多的加1和减1运算混合,不仅可读性差,而且因为编译器实现的方法不同,导致不同编译器产生不同的运行结果目前八十一页\总数一百零四页\编于十四点自动类型转换同种数据类型的运算结果,还是该类型不同种数据类型的运算结果,是两种类型中取值范围更大的那种longdouble>double>float>long>int>short>chardoublefloatlongunsignedintchar,short精度低精度高目前八十二页\总数一百零四页\编于十四点自动类型转换在进行赋值操作时,会发生类型转换将取值范围小的类型转为取值范围大的类型是安全的反之是不安全的如果大类型的值在小类型能容纳的范围之内,则平安无事但是,浮点数转为整数,会丢失小数部分,非四舍五入反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关。避免如此使用,好的编译器会发出警告目前八十三页\总数一百零四页\编于十四点类型强转(Casting)消除从大到小的警告l=(long)i;可以通过“(类型)表达式”的方式把表达式的值转为任意类型强转时,你必须知道你在做什么强转与指针,并称C语言两大神器,用好了可以呼风唤雨,用坏了就损兵折将屠龙

刀倚天剑目前八十四页\总数一百零四页\编于十四点例2.7

#include<stdio.h>main(){

intm=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);}m/2=2(float)(m/2)=2.000000(float)m/2=2.500000m=5两个整数运算的结果还是整数,不是浮点数目前八十五页\总数一百零四页\编于十四点位运算数的三种表示形式位式运算目前八十六页\总数一百零四页\编于十四点数的三种表示形式原码反码补码

符号位为0表示正数,符号位为1表示负数,数值位是其值的绝对值。正数:负数:

一个数如果值为正数,则它的反码与原码相同;一个数如果值为负,则符号位为1,其余各位是对原码取反。

正数:负数:

一个数如果值为正数,则它的补码与原码相同;一个数如果值为负,则符号位为1,其余各位是对原码取反,末位加1。

正数:负数:为简化运算部件设计计算机中大部分数据要用补码表示目前八十七页\总数一百零四页\编于十四点位式运算运算要求参加运算的操作数必须为整数或字符型。运算过程按照整数中的二进制位为单位进行运算。运算结果计算结果为整数。运算符号&(与)|(或)^(异或)~(反,一元)<<(左移)>>(右移)目前八十八页\总数一百零四页\编于十四点位式运算的运算规则&位式与:对a&b,仅当a、b的对应位均为1,结果该位为1,否则该位为0。举例:3&5=0011&0101=0001=1目前八十九页\总数一百零四页\编于十四点位式运算的运算规则|位式或:对a|b,只要a、b的对应位有一个为1,结果该位为1,否则该位为0。举例:3|5=0011|0101=0111=7目前九十页\总数一百零四页\编于十四点位式运算的运算规则^位式异或:对a^b,仅当a、b的对应位相反时,结果该位为1,否则该位为0。举例:3^5=0011^0101=0110=6目前九十一页\总数一百零四页\编于十四点位式运算的运算规则位式与:对a&b,仅当a、b的对应位均为1,结果该位为1,否则该位为0。举例:3&5=0011&0101=0001=1位式或:对a|b,只要a、b的对应位有一个为1,结果该位为1,否则该位为0。举例:3|5=0011|0101=0111=7位式异或:对a^b,仅当a、b的对应位相反时,结果该位为1,否则该位为0。举例:3^5=0011^0101=0110=6~位式取反:对应操作数每位上的0,结果该位为1,否则该位为0。举例:~5=~00000101=11111010目前九十二页

温馨提示

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

评论

0/150

提交评论