250 likes | 378 Views
数据类型、运算符与表达式. C 的数据类型. 整型 字符型 实型 ( 浮点型 ) 枚举类型 数组类型. 单精度型. 数据类型. 基本类型. 双精度型. 结构体类型. 构造类型. 共用体类型. 指针类型. 空类型. 常量. 在程序运行过程中,其值不能被改变的量称为常量,常量区分类型 , 12 、 0 、 -3 等为整型常量, 4.5 、 -1.23 等为实型常量,’ a’ 、’ g’ 等为字符型常量。一般可以通过常量的表达形式判断常量的类型。 #define RATE 8.54 void main( void ) { int result;
E N D
C的数据类型 整型 字符型 实型(浮点型) 枚举类型 数组类型 单精度型 数据类型 基本类型 双精度型 结构体类型 构造类型 共用体类型 指针类型 空类型
常量 • 在程序运行过程中,其值不能被改变的量称为常量,常量区分类型 ,12、0、-3等为整型常量,4.5、-1.23等为实型常量,’a’、’g’等为字符型常量。一般可以通过常量的表达形式判断常量的类型。#define RATE 8.54 • void main( void ) • { • int result; • result = 1000.0 * RATE; • printf( “result is %f \n”, result );} • 通常情况下,常量名的定义采用大写 • 使用符号常量的好处:1、含义清楚。2、在需要改变一个常量时能做到“一改全改”
变量 变量名 • 其值可以改变的量称为变量。 • C语言中标识符(变量名)命名规则 :1、只能由英文字母、数字字符、下划线构成,且第一个字符必须是英文字母(大写或小写)或下划线。2、在C语言中,变量名长度以简洁为目标,尽量做到“见名知义”力求程序凝练,Turbo C允许32个字符。3、变量名一般以小写英文字母形式命名。 • 变量必须“先定义、后使用”1、没定义的,不作为变量名,保证程序中变量名使用的正确 。 2、为变量制定类型,编译时好分配存储单元 3、指定类型 容易检验运算的合法性 a 变量值 63 存储单元
整型数据 • 整型常量 整型常量即整型常数十进制整数八进制整数(以0开头的数)十六进制整数(以0x开头的数) • 整型变量的分类整型变量总体上可以分为有符号数和无符号数两类
整型数 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 表示-1的补码 无符号整型数 表示数值65535 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 整型数据 • 整型数据在内存中的存放形式整型数据在内存中以二进制形式存放,确切的说是以补码的形式表示的。一个正数的补码和原码形式相同,而负数的补码是将该数的绝对值的二进制形式,按位取反再加1。
整型数据 • 整型变量的定义用定义类型字来定义变量的类型 ,一般放在函数开头的声明部分 。void main( void ){int a, b, c, d; /* 定义整型变量 */ unsigned u; a = 12; b = -24; u = 10; c = a + u; d = b + u; printf( “a + u = %d \t b + u = %d \n”, c, d );} • 整型数据的溢出如果一个整形变量存放的值,超出它所允许的范围,将会产生溢出,例如一个int型变量,如果其值为32767,再加1就会产生溢出,变成-32768。但运行时并不报错。
整型数据 • 整型常量的类型注意:1、一个整型常量,如果其值在-32768~+32767范围内, 认为它是int型,它可以赋给int型和long int型变量。2、一个整型常量,如果其值超过了上述范围,而在-2147483648~+2147483647范围内,则认为它是long int 型。 3、一个整型常数后面加一个字母u或U,认为是unsigned int 型。4、一个整型常数后面加一个字母l或L,认为是long int型常数。
小数部分 指数部分 实型数据 • 实型常量的表示方法1、十进制小数形式:.123 23.12、 指数形式:123e3 1.234e34(e前必须有数字,e后指数必须为整数)在数的后面加字母f或F,就为单精度数,否则处理成双精度数。 • 实型变量 单精度(float): 4B 10-38~1038 6~7双精度(double):8B 10-308~10308 15~16长双精度: 16B 10-4931~104932 18~19 • 实型数据在内存中的存放形式一个实型数据一般在内存中占四个字节,系统把一个实型数分成小数部分和指数部分,分别存放采用规范化的指数方式表示,如:
实型数据 实型变量的定义示例: float x,y; /*指定x、y为单精度实数*/ double z; /*指定z为双精度实数*/ 实型数据应用中的误差问题 main( ) { float a; double b; a=123456.789e5; b=a+20; printf("a=%f,b=%f\n",a,b); } 应避免将一个很大的数和很小的数直接作加、减运算,否则就会“丢失”小的数。
字符型数据 • 字符常量C语言的字符常量是用单引号括起来的一个字符 ,如’a’,’X’,’A’。C语言还有一些特殊字符的常量,如下表
字符型数据 void main( void ) { printf( “ ab c \t de\rf\tg\n” ); printf( “h\ti\b\bj k” ); } • 字符数据的存放一个字符常量放到一个字符变量中,是把该字符的ASCII码放在存储单元中。 • c1 c2 • 字符型变量 • 字符变量用来存放字符常量, • 字符变量的定义形式如下: • char c1,c2; • 可以用下面的语句对c1、c2赋值: • c1=‘a’; • c2=‘b’; printf(“%c,%c,%d,%d”,c1,c2,c1,c2); 97 98
字符型数据 • 例子 大小写字母的转换main( ){char c1,c2; c1=‘a’; c2=‘b’; c1=c1-32; c2=c2-32; printf(“%c %c”,c1,c2);} 注意:1、字符型数据和整形数据是通用的。但字符数据只能存放0~255范围内的整数。2、字符数据与整数可以直接进行算术运算。3、字符数据与整型数据可以相互赋值4、Turbo C将字符数据处理成带符号的整数,如果不想按有符号处理,可将字符变量定义为unsigned char类型。
a \0 a 字符型数据 • 字符串常量 字符常量是用一对双引号括起来的字符序列。 如:"How do you do ." "CHINA" "a" "$135.45" 可以用printf语句输出一个字符串常量: printf("How do you do .\n"); 注意:字符常量与字符串常量的区别: "a" ‘a’ C规定:在每一个字符串的结尾加一个字符串结束标志: "\0",以此判断字符串是否结束。
变量赋初值 变量赋值的方式分为两种: 1、先说明,再赋值。如: int x,y; x=10;y=20; 2、说明变量的同时赋值。这称为变量的初始化。如: float x=123.45;(等价于 float x;x=123.45;) int a,b,c=10; int a=13,b=34,c=2; float f=3.56;
各类数值型数据间的混合运算 • 数据类型转换整型、实型、字符型数据间可以混合运算。例如:10+’a’+1.5×2 -’b’=12.0000在运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则如下所示: 高double float long unsigned 低 int char,short 设 Int I;float f;double d;long e;则式子 10+’a’+i*f-d/e 的结果为double型
算术运算符和算术表达式 • C运算符简介 C语言的运算符有以下几类∶ 1.算术运算符 (+ - * / % ++ --)2.关系运算符 (< > == >= <= !=)3.逻辑运算符 (! && ||)4.位运算符 (<< >> ~ | ^ &)5.赋值运算符 (=及其扩展赋值运算符)6.条件运算符 (? :)7.逗号运算符 (,)8.指针运算符 (*和&)9.求字节数运算符 (sizeof)10.强制类型转换运算符 (类型)11.分量运算符 (.和->)12.下标运算符 ([ ])13.其它 (函数调用运算符( ))
算术运算符和算术表达式 • 基本算术运算符号+ (加法运算符,或正值运算符。) - (减法运算符,或负值运算符。) * (乘法运算符) / (除法运算符) % (模运算符,要求%两侧均为整型数) • 算术表达式和运算符的优先级与结合性 用算术运算符和括号将操作数连接起来的符合C语言语法规则的式子,称为C算术表达式。 运算对象包括常量、变量、函数等等。例如∶ a * b / c - 1.5 + ‘a’在表达式求值时,先按照运算符的优先级别高低次序执行。 算术运算符的结合方向为“自左至右”。优先级别和结合性参考附录Ⅲ
算术运算符和算术表达式 • 强制类型转换运算符将一个表达式转换成所需的类型。一般形式为∶ (类型名) (表达式) 注意:表达式应该用括号括起来。例如∶ (double)a /* 将a转换成double类型 */ (int)(x+y) /* 将x+y的值转换成整型 */ (float)(5%3) /* 将5%3的值转换成float型 */在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例如∶ (int)x 而不要写成 int(x) • 总结:类型转换有两种:1、自动类型转换2、强制类型转换
算术运算符和算术表达式 • 自增、自减运算符作用是使变量的值增1或减1。例如∶ ++i, --i /* 在使用i之前先使i的值加(减)1 */ i++, i-- /* 在使用i之后先使i的值加(减)1 */区别:j = ++i; j = i++; 注意∶1、上述两种运算只能用于变量,而不能用于常量或表达式。 2、上述两种运算的结合方向是“自右至左”。例子:若i=3 , 则printf(“%d”, -i++) ;输出结果为-3,然后 i增值为4
算术运算符和算术表达式 • 有关表达式使用中的问题说明 1、表达式中包含自增或自减运算时,很容易出错。例如:(i++)+(i++)+(i++)不同系统处理的不同,如i为3,可为3+4+5,也可为3+3+3,为避免歧义性,如果想得到12,可以写成如下:i=3: a=i++; b=i++; c=i++; d = a+b+c; • 2、C语言中有的运算符为一个字符,有的运算符由两个字符组成,在表达式中尽可能多的“自左而右”组成一个运算符 。如:i+++j应解释为(i++)+j,而不是i+(++j)。 • 3、在调用函数时,实参数的求值顺序,标准C中并没有统一规定。如:设i的初值为3,下面的函数调用 printf( “%d %d\n”, i, i++ ) 在有的系统中,从左到右求值,输出“3,3”。在多数系统中,是从右到左求值,输出“4,3”。最好改成j=i++; printf(“%d,%d”,I,j); 不要写别人看不懂,也不知道系统会怎样执行的程序
赋值运算符和赋值表达式 • 赋值运算符 赋值符号“=”就是赋值运算符 ,它的作用就是把一个数据赋给一个变量。 • 类型转换如果等号两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。 1、将实型数据赋给整型变量时,舍去实数的小数部分。 2、将整型数据赋给单、双精度变量时,数值不变;但以浮点数形式存储到变量中。 3、字符型数据赋值给整型变量 ,有两种情况∶①如果所用系统将字符处理为无符号的量,或对unsigned char型变量赋值,则将字符的8位放到整型变量低8位,高8位补0。②如果所用系统将字符处理为带符号的量,则进行符号扩展。 4、将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动的送到char变量。
赋值运算符和赋值表达式 5、将带符号的整型数据(int)赋值给长整型(long int)变量时,要进行符号扩展。反之若将长整型数据赋值给一个整型变量,只将长整型数据中低16位原封不动送到整型变量(截断)。 6、将无符号整型数据(unsigned int)数据赋值给长整型(long int)变量时,不存在符号扩展的问题,只需将高位补0即可。 7、将有符号型赋值给长度相同的unsigned型变量,也是原样照赋。
赋值运算符和赋值表达式 • 复合赋值运算符 在等号之前加上其它运算符,可以构成复合的运算符。例如∶ a += 3 等价于 a = a + 3 x *=y+8 等价于 x = x * ( y + 8 )C语言规定可以使用十种复合赋值符,即∶ += -= *= /= %= <<= >>= &= |= ^= • 赋值表达式 它的一般形式为 <变量><赋值运算符><表达式>上述一般形式的赋值运算表达式中的“表达式”又可以是一个赋值表达式。例如∶ a = ( b = 5 ) ; a = 5+(c = 6); a=(b=10)/(c=2);a+=a-=a*a
逗号运算符和逗号表达式 • 逗号运算符它将两个表达式连接起来。其一般形式为 表达式1,表达式2逗号表达式的求解过程是∶先求表达式1,再求表达式2。整个逗号表达式的值 是表达式2的值。例如∶ ( a = 3 * 5, a * 4 ), a + 5其值为20 逗号表达式的一般形式的扩展形式为∶ 表达式1,表达式2,……,表达式n它的值为表达式n的值 在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值。逗号表达式最常用于循环语句中。 注意∶并不是任何地方出现的逗号都是逗号运算符。