280 likes | 367 Views
第三章 数据类型、运算符与表达式. §3.1 C 的数据类型. . . . 3.2.1 常量 (Constant) 与符号常量 常量 : 在程序运行过程中,其值不能被改变的量 符号常量 : 代表常量的标识符(符号)。 符号常量通常用 大写字母 表示。 定义格式 : #define NUMBER 60. §3.2 常量与变量. #define PRICE 30 main() { int num, total; num = 10; total = num * PRICE;
E N D
第三章 数据类型、运算符与表达式
§3.1 C的数据类型
3.2.1 常量(Constant)与符号常量 常量:在程序运行过程中,其值不能被改变的量 符号常量:代表常量的标识符(符号)。 符号常量通常用大写字母表示。 定义格式: #define NUMBER 60 §3.2 常量与变量
#define PRICE 30 main() { int num, total; num = 10; total = num * PRICE; printf("total = %d",total); } [例3.1] #define语句定义一个符号常量PRICE,其值等于30。该值在程序运行过程中不能被改变。 符号常量通常用大写字母表示。 编译程序在翻译源程序文件时,符号常量PRICE用其值30替换。 程序运行结果是: total = 300
变量:其值可以被改变的量。 变量用标识符表示,以字母、数字、下划线组成,且第一个字符必须为字母或下划线。 注意:大写字母和小写字母被认为是两个不同的字符。 建议:变量名的长度不超过8个字符。 C语言规定:所有的变量都应作强制定义,做到“先定义,后使用”。 3.2.2 变量(Variable) 以下哪些变量定义是合法的: 1. sum 2. 7average 3. student_name 4. _above 5. lotus_1_2_3 ×
变量名(符号地址) 变量值 存储单元 total 80 一个变量应该有一个名字,在内存中占据一定的存储单元,在该单元中存放变量的值。 int total total=80
3.3.1 整型常量 C语言中数值常量的表达方式:3种 1、十进制整数 123 十进制: 表示十进制数123 2、八进制整数(0开头): 0123: 八进制数 ,表示十进制数83 3、十六进制整数(0x开头): 0x123:十六进制数, 表示十进制数291 §3.3 整 型 数 据
一、整型变量的分类 基本型(整型)int2字节 短整型 short 或 short int2字节 长整型 long 或 long int4字节 无符号整型:unsigned 2字节 无符号短整型:unsigned short 2字节 无符号长整型:unsigned long 4字节 实际上C语言的整型变量在计算机内存中所占的 字节数与具体的机器和操作系统有关。 3.3.2 整型变量
main() {int a,b,c,d; unsigned int u; a = 12; b = -24; u = 10; c = a + u; d = b+u; printf("a+u = %d, b+u = %d\n", c, d); } 程序运行显示:a+u = 22, b+u = -14 int变量的数值范围为-32768~32767。 Unsignde int变量的数值范围为0~65535。 二、整型变量的定义
3.4.1 实型常量 实数(real)又称为浮点数(float), 有两种表达方式: 1、十进制数形式 0.123、 .123、 123.、 0.0(必须有小数点) 2、指数形式 123e3或123E3代表:123103 123E2.5、E3,E 都不合法。 (注意:e或E前面要有数字,后面要是整数。) §3.4 实型数据
单精度:float 4字节 (32位) 双精度:double 8字节 (64位) 长双精度:long double 16字节(128位) 例1:float x,y; /* 指定x、y为单精度实型变量 */ double z; /* 指定z为双精度实型变量 */ 实型常量不分float和double。 例2:float a; a=123456.711 float型变量只能接受7位 有效数字,最后两位数字不起作用。 double 型变量能接受16位 有效数字。 3.4.2 实型变量
3.5.1 字符常量 字符常量:用单引号(撇号)括起来的一个字符。 如:‘a’、‘x’、‘?’、‘$’。 注意,‘a’和‘A’是不同的字符常量。 ‘a’ : ASCII码:97 01100001 ‘A’ : ASCII码:65 01100010 §3.5 字符型数据
实际上,一个字符常量在内存中的存储并不是 把该字符本身放进去,而是存放其对应的 ASCII码 值,即仍以二进制补码的形式存储。一个字符常量 占据一个字节(8位)。 常用的ASCII码值: 0 → 48 + →43 SP →32 A → 65 - →45 LF →10 A → 97 * →42 Del →127 / →47 如果定义的是 signed char,则取值范围是 -128~127; 如果定义的是 unsigned char,则取值范围是 0~255。
Printf(“\101;\x69”); A; i 转义字符(P48) \t跳到下一个tab位置 \r将光标移到本行首 \n将光标移到下行首 \b退格,光标前移一列 main() { printf(“ ab c\t de\rf \tg\n”); printf(“h\ti\b\bj k”); } 输出结果应该是: \ddd 1到3位8进制数所代表的字符 \xhh 1到2位16进制数所代表的字符 f _ _ _ _ _ _ _ gde h _ _ _ _ _ _ j _ k
字符变量用来存放一个字符常量. 字符变量在内存中占一字节。 变量赋初值: 例1: char c1,c2; /* 定义c1、c2为字符变量 */ c1 = 'a'; c2 = 'b'; 例2: char c1=‘a’; 等效: char c1; c1=‘a’; 3.5.2 字符变量
[例3] main() { char c1,c2; c1 = 97; c2 = 98; printf("%c %c",c1,c2); } c1 c2 a b 相当于:c1 = ‘a’; c2 = ‘b’; 因为:字符以 ASCII码存放,‘a’的ASCII码为97,‘b’的 ASCII码为98。 输出结果是:a b 字符以 ASCII码存储,其存储 方式与整数类似。从而,C 语 言允许字符和整数之间进行运 算。
例3.7:大小写字母的转换: main( ) { char c1,c2; c1=‘a’; c2=‘b’; c1=c1-32; c2=c2-32; printf (“%c,%c”,c1,c2); } 运行结果为: A B
字 符常量:单引号括起来的一个字符。 字符串常量:双引号括起来的字符序列. 字符串常量在内存中的存放:每一个字符均以其ASCII码存放,且最后添加一个结束符“\0”. 例:"How do you do.", "CHINA" “CHINA”存放在内存中的长度是6个字节而不是5个字节。 C H I N A \0 最后一个字符 3.5.4 字符串常量
课堂练习: 3.1 指出下面哪些是合法的变量名: ①123 ②abc ③a+b ④a_b ⑤pad ⑥?12 ⑦Li_Li ⑧*P 3.2 ‘a’在内存中占个字节,“a”在在内存中占 个字节. 3.3 写出下面程序的运行结果: main() { char ch; ch=‘B’; /*B的ASCII码值为66*/ printf(“%c,%d\n”,ch,ch) } ②④⑤⑦ 1 2 B 66
在定义变量的同时指定其初值。 例、 int a = 3; float f = 3.56; char c = 'a'; int a, b, c = 5; 注意:多个变量指定相同初值的方法: int a = b = c = 3 ; int a = 3, b = 3, c = 3; int a; a=3; §3.6 变量赋初值 ╳
整型、实型(包括单、双精度)、字符型数据可以混合运算。例:整型、实型(包括单、双精度)、字符型数据可以混合运算。例: 10 + 'a' + 1.5 - 8765.1234 * 'b' 混合运算时,先将各数转换成同一种类型,然后进行运算。转换规则如下图。 §3.7 各类数据混合运算 高 double float long unsigned 低 int char,short 所以,该例的结果为实型。
例: int i; float f; double d; long e; 10 + 'a' + i * f - d/e 高 double float long unsigned 低 int char,short 双精度 整型 单精度 上述转换过程是由系统自动进行的。所以结果为双精度double型。
3.8.1 算术运算符和算术表达式 一、基本的算术运算符 +加法运算符,如3+5 正值运算符,如+3 -减法运算符,如5-2 负值运算符, 如-3 *乘法运算符, 如3*5 /除法运算符,如5/3 %模运算符(求余运算符),如7%4=3 (求余的运算对象必须是整数。) §3.8 算术运算符和算术表达式
二、强制类型转换 运算符两侧的数据类型不同时,先自动进行类型转换,再运算。程序员可以强制进行某种转换。 强制类型转换的一般形式是: (类型名)(表达式) (int) a;
例、 (double)a; /* 将a转换为double类型 */ (int)(x+y); /* 将x+y的值转换为int类型 */ (float)(5 % 3); /* 将5%3的值转换为float类型 */ 注意: (int)(x+y); /* 将x+y的值转换为int类型 */ (int)x+y; /* 将x的值转换为int类型,再与y相加 */ (int) (x); (int) x;/*表达式仅为一个变量时,括号可以省略*/ int (x);/* 变量x的类型不发生变化*/ 说明:强制类型转换时,得到一个所需类型的中间变量,原来变量的类型不发生变化。 例3.8 (P56) ╳
自增:使变量的值加1; 自减:使变量的值减1。 ++i; /* 在使用i之前使i加1 */ - -i ; /* 在使用i之前使i减1 */ i++ ; /* 在使用i之后使i加1 */ i- - ; /* 在使用i之后使i减1 */ 自增自减运算符特点: 右结合性且只能用于变量。 如:5++和 (a+b)++都是错的! 三、自增自减运算符
例: i = 3; j = ++i; /* 先使i加1,再赋给j。*/ 执行后:j=4, i=4 i = 3; j = i++; /* 先把i赋给j,再使i加1。*/ 执行后:j=3,i=4 注意:尽量不要写成j+++i形式,避免歧义的产生。
[例] main() { int a; a = 3; printf("%d", a++); printf("%d", a); } 运行结果是: 3 4