华南农业大学plc课件第2章.ppt_第1页
华南农业大学plc课件第2章.ppt_第2页
华南农业大学plc课件第2章.ppt_第3页
华南农业大学plc课件第2章.ppt_第4页
华南农业大学plc课件第2章.ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

第2章 数据类型、运算符与表达式,2.1 C语言的基本符号 2.2 C 语言的数据类型 2.3 运算符和表达式 2.4 数据类型转换 2.5 自增,自减运算 2.6 位运算,2.1 C语言的基本符号,C语言的基本词汇表有下列几部分: 数字:10个(09)。 英文字母:大、小写各26个(AZ,az)。 下划线字符“_”(用来构成标识符)。 运算符:是指为表达程序基本操作使用的一些符号; 关键字:是指为表达程序功能使用的一些英文单词或单词缩写。,2.1.1 标识符,定义: 程序中用来为符号常量、变量、函数、数组、类型、文件命名的有效字符序列称为标识符。 命名规则: 1 只能由字母、数字和下划线组成。 2 第一个字符必须为字母或下划线。 3 不能使用关键字。 4 区分大小写字符。 5 ANSI C 没有规定标识符的长度,各个编译系统允许的标识符的长度(字符个数长度)不同。,2.1.2 常量,定义:常量又称为常数,是在程序运行过程中其值不能被改变的量,常量的类型是由本身隐含决定的。 举例:25、0、-13为整型常量; -55.23、0.57、3.8e3为实型常量; B,9为字符型常量。 符号常量: 在C语言中,经常使用一个标识符来代表一个常量。也就是给常量命名,称为符号常量,,例2-1 阅读程序。 #define PI 3.1415926 /*宏定义*/ main( ) float r=18.5, area, length ; area =PI*r*r ; length =2*PI*r; printf(“area=%6.2f, length=%6.2f“, area, length); 符号常量几点说明: 程序中用宏定义的方法,定义标识符PI代表常量。 通常在程序中,符号常量名一般用大写字符。 符号常量不同于变量,其值在有效范围内不能改变,也不能再被赋值。 在程序中使用符号常量,可以作到“含义清楚”;“一改全改”,从而提高程序的可读性,方便程序的修改。,2.1.3 变量,1变量的基本概念 定义:在程序运行过程中其值可以改变的量称为变量,变量具有数据类型,变量名和变量值三个属性,变量在其存在期间,在内存中按照指定的类型占据不同长度的存储单元,可以用来多次存放不同的数值。 变量名: 选择一个标识符,给变量取一个名字称为变量名,变量名的命名规则与标识符完全相同。 变量值: 是对应变量名的存储单元所存放的具体的数值。 变量的数据类型: 是指变量可以存储的数据的类型,也就是变量值的数据类型;,2变量的定义 变量的定义: 在程序中指定变量的名字和数据类型。在编译时根据变量的数据类型不同,系统分配相应大小的存储单元。 变量的定义一般是在一个函数开头的声明部分。也可在函数中的某一复合语句内,但变量起作用的范围只限它所在的复合语句。 变量定义的一般形式: 类型说明符 变量名1,变量名2,变量名3, ,变量名n; 举例: int k, m, n ; /* 定义三个整型变量 */ char str; /* 定义一个字符型变量 */,3变量的初始化 在C语言中,定义变量的同时,还可以为变量指定初值,称为变量的初始化。例如程序段: float y=0.5; char str=a; int j=0, sum=100; /*该定义变量方式与下面的语句等价:*/ int j, sum; j=0; sum=100; 也可以对被定义变量的一部分赋初值。 int i=0, j=0, k, sum; 不可以用下面的写法对几个变量同时赋同一个初值。 int i=j=k=0;,几点说明: 程序运行时从变量中取值,实际上是通过变量名找到相应的内存地址,从其相应的存储单元中读取数据。 在程序中变量名在其有效范围内不能更改,但变量值却可以动态更换。 变量定义后并没有确定的值,或者说值是随机的。但可以采用某些方法给变量赋值, 当再次给变量赋值时,新值将替代旧值。 程序在使用变量前,先要对变量做定义,必须“先定义,后使用。”,58,a1,2001,a1: 变量名 58: 变量值 2001 :存储单元地址,Int a1=50; a1=58; a1=a1+2;,2002,2.1.4 关键字,定义: C语言为了清晰的表达程序的功能,使用了一些英文单词或单词缩写,这些单词称为关键字。 举例:if int while。详细的内容参见附录二。 下面几个字虽然不属于关键字,但建议读者把它们看作关键字,不要在程序中随便使用。 define undef include ifdef ifndef endif,2.2 C 语言的数据类型,C语言中根据数据的不同性质和用处,将其分为不同的数据类型,各种数据类型具有不同的存储长度、取值范围及允许的操作。 C语言将能处理的数据分成两大类型,基本类型和构造类型,构造类型的数据是由若干个基本类型或构造类型按一定的结构组合而成的。 语言规定:在程序中用到的数据,都必须指定其数据类型。,2.2.1 整型数据,1整型变量 (1)有符号整型变量的分类 有符号整型变量按数值的范围分为三种: 1 基本整型:以int作为类型说明符。 2 短整型:以short int或short 作为类型说明符。 3 长整型:以long int或long 作为类型说明符。 整型变量一般在内存中占的字节数与所选择的系统有关,规定long型整数不短于int型,short型整数不长于int型。,(2)无符号整型变量的分类,定义: 用来处理一些不带符号的整型变量,将存储单元中的全部二进制位都用来存放数,取消符号位,称为无符号整型。 无符号整型变量按数值的取值范围不同也分为三种: 1 无符号基本整型:以unsigned int作为类型说明符。 2 无符号短整型:以unsigned short int或unsigned short 作为类型说明符。 3 无符号长整型:以unsigned long int或unsigned long 作为类型说明符。,整型数据在内存中的存储形式,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,符 号 位,数 据 位,=32767,=65535,有符号整型,无符号整型,例2-2 阅读程序 。 main() int a=12345, b= -23456; / *定义a, b为整型变量, 并初始化 */ long c=32100, sum1; /*定义c, sum1为长整型变量, 并初始化变量c*/ unsigned int sum2; /*定义sum2为无符号整型变量 */ sum1=b-a; sum2=c-b; printf (“sum1=%ld, sum2=%u“,sum1,sum2); /*%ld表示长整型十进制数,u表示无符号十进制数*/ ,运行结果: sum1=-35801, sum2=55556,2整型常量,整型常量的表达形式 整型常量就是整常数。有以下三种表达形式: 1 十进制整数 例如:567、0、-89。 2 八进制数 特征是以数字符0开头,并由数字符07组成的字符序列,例如0125,011; 3 十六进制数 特征是以0x或0X开头,并由数字符09,和字符af或者字符AF组成的数字符序列。 0x2ab, 0X2AB。 (2) 整型常量的类型 整型常量的类型是由其本身隐含决定的。 例如32767的类型是int,32769类型是long (因为3276932767) 。,几点说明:,1 常量无unsigned 型,但一个非负的整数在unsigned 型的取值范围内,可以赋值给一个unsigned 型变量,例如:unsigned int a=50000;是可以的,而unsigned int a=70000;是不可以的。(因为70000 65535)。 2 一个整常量后面加一个字母L(或小写l), 则明确指定该常量是long int型的,例如0L,123L,234l等。,2.2.2 实型数据,1 实型变量 (1) 实型变量的分类 实型变量按数值的范围分为三种: 1 单精度实型:以float 作为类型说明符; 2 双精度实型:以double 作为类型说明符; 3 长双精度实型:以long double 作为类型说明符; 类型 说明符 字节数 比特数 有效数字 数值范围 单精度实型 float 4 32 6-7 10-38 1038 双精度实型 double 8 64 1516 10-308 10308 长双精度实型 long double 16 128 1819 10-4932 104932,(2) 实型变量的定义,对每一个实型变量,都应在使用前进行定义,例如: float x, y; /*定义x, y为单精度实数 */ double z; /*定义z为双精度实数 */,2实型常量,(1) 实型常量的表达形式 十进制小数形式 0.125、.125、-0.125、-125.0、1.25; 指数形式 一般格式是 实数(整数)+e (或E)+整数。 例如:123.456的指数形式是1.23456e2、1.23456E2 、12.3456e1 、0.0123456e4、 .123456e3、 12345.6e-2等。 而e2、1.23e3.5 、e 、12345E 等都是不合法形式。,2.2.3 字符型数据,1字符常量 定义: 字符常量是用单撇号括起来的一个字符。 举例: a , A,$,5等都是字符常量。 转义字符:还有一些特殊的字符,C语言约定用 “”开头的字符序列作为标记,这类字符统称为“转义字符。 举例:转义字符n中的“n”不代表字母n,该转义字符表示在输出过程中将当前位置移到下一行的开头,简称换行; 转义字符 中的“ ”代表字符 “”, 转义字符101中的 101是十进制的ASCII 码65,代表字符A。 (转义字符表见书P14-15),例2-4 阅读程序。 main() printf(“ctlanguagsberCn“); printf(“istusef165x6c“); ,运行结果: C language is useful,注:t表示一个TAB位置,即8位空格; b退格, 即把s覆盖,再显示e, 就变成了language; r回车, 将当前位置移到本行的开头, 再在小写c位置显示大写的C; n换行,将当前位置移到下一行的开头;165是八进制,转为十进制的ASCII码为117,表示字母“u”;x6c是十六进制,转为十进制ASCII码为108,表示字母“l”。,2字符变量,定义: 用来存放一个字符常量的变量称为字符变量。 同样,字符变量在使用之前必须首先定义,以char 作为类型说明符。 例如程序段: char c1, c2; /*定义变量c1,c2为字符变量*/ c1= a; c2= b; /*将字符常量存放到字符变量中*/ 几点说明: 字符常量或字符变量在内存中都只占有一个字节。 字符在程序中是以ASCII码的形式表示的,在内存中是以二进制的形式存储的,它与以整数的存储形式相类似。 在C程序中,字符型数可以当作整型数进行处理,并且可以和整型数混合操作和处理。,例2-5 阅读程序。 main() char ch1; int ch2; ch1=A; ch2=B; printf(“n%d,%dn“,ch1,ch2); ch1=97; ch2=98; ch1=ch1+6; ch2=98+6; printf(“%c,%cn“,ch1,ch2); printf(“%d,%d“,ch1,ch2); ,运行结果: 65,66 g,h 103,104,3字符串常量,定义:字符串常量是括在一对双撇号之间的字符序列(其中也可以包括转义字符), 举例:“C language ”,“s”,“$35.56”, “tChinsban”。(t制表符,b退格) 字符串常量中的字符依次存储在内存中一块连续的区域内,并把空字符0 (ASCII 值为0)自动地附加到字符串的尾部作为字符串的结束标志。因此,对于字符个数为n的字符串,所占内存空间应为n+1个字节。 例如:字符串“HELLO“ 字符个数为5,所占内存空间应为6个字节。,字符常量和字符串常量的区别:,在程序中,可以用字符常量或字符串常量表示单个字符,例如 a,或“a”,两者的区别如下: 1 字符串“a“在内存中占2个字节,而字符a 在内存中占1个字节。 字符串“a“ 字符a 2 不能将字符串赋给一个字符变量。 例如程序段: char ch1,ch2; ch1=a; /*正确*/ ch2=“a“; /*错误*/,a,0,a,2.3 运算符和表达式,运算符定义: 描述各种操作的符号称为运算符。 表达式定义: 用运算符将被操作对象连接起来,符合C语言语法的式子称为表达式。 表达式特点: (1) 常量和变量都是表达式 (2) 运算符的类型对应表达式的类型,例如:算术运算符对应算术表达式。 (3) 每一个表达式都有自己的值。,运算符属性:,(1) 优先级 当若干个运算符同时出现在表达式中时,优先级规定了运算的先后次序。由于C语言运算符种类很多,所以优先级有15级之多。 C语言把圆括号作为运算符,规定它的优先级最高,规定为15级,从而保证优先运算圆括号内的式子,逗号运算符的级别最低,规定为1级。 (2) 结合性 当若干个具有相同优先级的运算符相邻出现在表达式中时,结合方向规定了运算的先后次序。分为“从左到右”和“从右到左”两个结合方向。 一般来说,大多数运算符的结合方向”从左到右”, 只有单目运算符、赋值运算符和条件运算符的结合方向”从右到左”,这里单目运算符是指作用于一个操作对象的运算符。,2.3.1 算术运算符和算术表达式,算术运算符: + , - , * , / , % 几点说明: 1 +、-、*与数学中的意义相同。 2 在除法运算中,两个整数相除的结果为整数,一般采用”向零取整”的规则,取整时向零靠拢。例如9/2运算结果为4;-9/2运算结果为-4。 3 %是取余运算符或称模运算符,该运算只能作用于两个整型数,运算结果是两个整数相除后的余数,运算结果为整数。并且规定运算结果的正负符号与被除数的符号一致,如果被除数小于除数,运算结果等于被除数。 9%2运算结果为1, 2%9的运算结果为2, -9%2的运算结果为-1,9%-2的运算结果为1,。,2.3.2 赋值运算符和赋值表达式,赋值运算符是符号“=”, 作用:将一个数据赋给一个变量,由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。 赋值表达式的一般形式:变量=表达式 作用:把赋值运算符右边表达式的值赋给赋值运算符 左边的变量,几点说明:,1 赋值运算后,变量原来的值被表达式的值替换。 2 赋值表达式的值也就是赋值运算符左边变量得到的值,如果右边表达式的值的类型与左边变量的类型不一致,以左边变量的类型为基准,将右边表达式值的类型无条件地转换为左边变量的类型,相应的赋值表达式的值的类型与被赋值的变量的类型一致。 3 赋值运算符的优先级很低,仅高于逗号运算符。结合方向为“从右向左”。 例:int a=2,b=5 计算表达式 x=y=a+b的值。,2复合赋值运算符,复合赋值运算符,相应的由复合赋值运算符也可以构成赋值表达式。 复合赋值运算符包括: + = - = * = / = % = (与算术运算有关) = 从第四步转换为第五步 最后表达式的值为0,变量a 的值也为0。,3逗号运算符和逗号表达式,逗号表达式的一般形式: 表达式1,表达式2,表达式n 逗号运算符的优先级是所有运算符中最低的。 逗号运算符的功能是使得逗号表达式中的各个表达式从左到右逐个运算一遍,逗号表达式的值和类型就是最右边的“表达式n”的值和类型。例如: m=1,n=2 a=(m+n,m-n) /*a等于-1,表达式的值为-1*/ a=m+n,m-n /*先计算赋值表达式,a等于3,表达式的值为-1*/ a=m+n,m-n+a /*先计算赋值表达式,a等于3,表达式的值为2*/ 注意:最后两个表达式的值不是a的值,因为没有括号,3逗号运算符和逗号表达式,例如,求逗号表达式 a=3*5,a*4 赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。 一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式 例如,求(a=3*5,a*4),a+5 先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。,逗号表达式的一般形式可以扩展为 表达式1,表达式2,表达式3表达式n 它的值为表达式n的值。 逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的: x=(a=3,6*3) x=a=3,6*a 第个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。,3逗号运算符和逗号表达式,3逗号运算符和逗号表达式,请注意并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如 printf(“%d,%d,%d“,a,b,c); 上一行中的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数,参数间用逗号间隔。 如果改写为 printf(“%d,%d,%d“,(a,b,c),b,c); 则“(a,b,c)”是一个逗号表达式,它的值等于c的值。括弧内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容是一个整体,作为printf函数的一个参数。,2.4 数据类型转换,整型、实型和字符型数据可以进行混合运算,在进行运算时,一般类型的数据先转换成标准类型的数据,不同类型的数据要先转换成相同类型的数据。转换规则如下: 1、在运算过程中,每个数据要转换为标准类型,以提高运算精度,例如:如果一个数据是float型,首先应转换为double型;如果一个数据是short型或char型,首先应转换为int型。,2.4.1 不同数据类型的数据间的混合运算,2、通过第一步转换后,如果参与运算的数据类型仍不相同,不同类型的数据要先转换成同一类型的数据,然后进行运算。 转换的规则是,“由低向高”,也就是说一个表达式的值的类型是其中各个参与运算的数据中级别最高的类型。 优先级从低到高的顺序为:int(char,short int类型首先应转换为int型),unsigned int(unsigned short int类型首先应转换为unsigned int型),long int,unsigned long,double(float类型首先应转换为double型) 看P20页中的说明和例子,2.4.2 强制类型转换,强制类型转换是指将表达式的运算结果也就是表达式的值转换为指定的类型。强制类型转换的一般形式: (类型说明符)表达式 说明: 1、对表达式进行强制类型转换时,表达式应该用括号括起 来,否则产生不同的结果。 2、对变量进行强制类型转换时,只能得到一个中间变量,并不改变该变量原有的类型 3、强制类型转换运算符的优先级高于求余运算符 参看P21页的例子,2.5 自增,自减运算,一般形式: 变量 或 变量 变量 或 变量 作用:使变量的值增1或减1,其中变量是指算术类型的变量。 设x为算术类型的变量: x+和+x的相同之处单独作为一个表达式语句被使用时无论执行了哪一种表达式,执行结束后x的值都增加1; 当x+和+x出现在其他表达式中时,也就是说作为其他表达式的一部分时,表达式的结果是不同的,表达式+x的值等于x的原值加1;表达式x+的值等于x的原值。 +x是先将x加1后,再在表达式中使用x的值,而x+是在表达式中先使用x的值后,然后将x的值加1。 自减运算与自增运算类似,只是把加1改成减1而已。,例2-10 阅读程序。 main() int i=1,j=1,m; m=i+; /*等价于: m=i; i+=1; */ printf(“i=%d,m=%dn“,i,m); m=+j; /*等价于: j+=1; m=j; */ printf(“j=%d,m=%dn“, j, m); printf(“i=%d,j=%dn“, i - - , - -j ); ,运行结果: i=2,m=1 j=2,m=2 i=2,j=1,几点说明: 1 自增运算符和自减运算符只能用于变量,不能 用于常量和表达式; 例如:+5,(a+b+3)+ 是错误的应用。 2 自增运算符+和自减运算符的结合方向是“从右向左”,优先级为14,仅次于圆括号。 3 自增运算和自减运算实质上是算术运算和变量赋值运算 两种运算的结合。,例2-11阅读程序。 main() int i=1; printf(“%d, “, -i+); printf(“i=%d“, i); ,运行结果: -1, i=2,2.6 位运算,1按位取反运算符 一般形式: A 功能:把A的各位都取反(即0变1,1变0)后所得到的值。 例:若int A= 179(十六进制0xb3、二进制0000000010110011),则 A的值等于1111111101001100 (ff4c)。 A = 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 A = 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0,2. 按位与运算符&,一般形式: A&B 功能:对A的各位与B的对应位进行比较,如果两者都为1,A&B对应位上的值为1,否则为0。 例如:若int A= 179(十六进制0xb3、二进制0000000010110011), int B=169(十六进制0xa9、二进制0000000010101001), 则A&B 值等于 10100001 或 0xa1 或161。 A= 1 0 1 1 0 0 1 1 B= 1 0 1 0 1 0 0 1 A&B= 1 0 1 0 0 0 0 1,3. 按位或运算符 |,一般形式: A | B 功能:对A的各位与B的对应位进行比较,如果两者中有一个为1,A | B对

温馨提示

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

评论

0/150

提交评论