第三章 数据类型、运算符与表达式
DESCRIPTION
第三章 数据类型、运算符与表达式. 整型 int. 3.1 C 的数据类型. 整型. 长整型 long. 字符型 char. 单精度型 float. 基本类型. 实型(浮点型). 双精度型 double. 枚举类型. 数组类型. 数据类型. 构造类型. 结构体类型. 共用体类型. 指针类型. 空类型. 3.2 常量与变量. 3.2.1 常量与符号常量 1. 常量的概念 在程序运行过程中,其值不能被改变的量称为常量。 2. 常量的分类 ( 1 )整型常量 ( 2 )实型常量 ( 3 )字符常量。 ( 4 )符号常量。 - PowerPoint PPT PresentationTRANSCRIPT
第三章 数据类型、运算符与表达式3.1 C的数据类型
数据类型
基本类型
构造类型
指针类型
空类型
整型
实型(浮点型)
字符型 char单精度型 float
长整型 long
整型 int
双精度型 double枚举类型
数组类型结构体类型共用体类型
3.2 常量与变量3.2.1 常量与符号常量
1.常量的概念 在程序运行过程中,其值不能被改变的量称为常量。
2.常量的分类 ( 1)整型常量
( 2)实型常量( 3)字符常量。( 4)符号常量。常量的类型,可通过书写形式来判别。3. 符号常量:有时为了使程序更加清晰和便于修改,用一个标识
符来代表常量,即给某个常量取个有意义的名字,这种常量称为符号常量。
#define PI 3.1416使用符号常量的好处:( 1 )含义清楚、见名知意。( 2 )修改方便、一改全改。
#define PI 3.14#include<stdio.h>void main()
{
float area;
area=10*10*PI;
printf("area=%f\n",area);
}
结果: area=314.000000
例 3.1 符号常量的使用#define PRICE 30
#include<stdio.h>
void main()
{
int num,total;
num=10;
total=num*PRICE;
printf("\ntotal=%d",total);
}
3.2.2 变量1.变量的概念在程序运行过程中,其值可以被改变的量称为变量。2.变量的两个要素( 1 )变量名。每个变量都必须有一个名字──变量名,变量命名遵循标识符命名规则。( 2 )变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。
3 .标识符命名规则( 1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。( 2)有效长度:随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。例 如 , 由 于 student_name 和student_number 的前8个字符相同,有的系统认为这两个变量,是一回事而不加区别。在 TC V2.0 中,变量名(标识符)的有效长度为1~32个字符,缺省值为32。
( 3) C语言的关键字不能用作变量名。注意: C语言对英文字母的大小敏感,即同一字母的大小写,被认为是两个不同的字符。习惯上,变量名和函数名中的英文字母用小写,以增加可读性。思 考 题 : 在 C 语 言 中 , 变 量 名 total 与 变 量 名TOTAL、 ToTaL、 tOtAl等是同一个变量吗?
标识符命名的良好习惯──见名知意:所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。例如, name/xm (姓名)、 sex/xb (性别)、 age/nl (年龄)、 salary/gz(工资)。
变量的地址:变量在内存中占据相应字节的存储空间该存储空间的首地址即为变量的地址,变量 a的地址用&a表示变量的声明:变量在使用前必须先声明,其声明格式为类型标识符 变量名;变量的赋值: 变量名=表达式没有赋值的变量其值是不确定的
3.3 整型数据3.3.1 整型常量的表示方法
八进制整数:以数字 0开头的八进制数。如: 0127
十六进制数:以 0x开头的十六进制数 .如: 0x2f
长整型:后面加 l或 L。如: 12L
无符号整型:后面加 U或 u
3.3.2 整型变量
1,整型数据在内存中的存放形式:以二进制补码的形式存放
补码:正数的补码与原码相同,负数的补码为除符号位(最高位)外,其余各位取反后加 1
10 的二进制表示为: 1010
10 的存放形式为: 00000000 00001010
-10 的存放形式为: 10 的存放形式按位取再反加 1 ,即: 11111111 11110101+1=
11111111 11110110
1234=1024+210=1024+128+64+16+2
=1×210+ 0×29 + 0×28 + 1×27 + 1×26 + 0×25 + 1×24 + 0×23 + 0×22 + 1×21 + 0×20 =10011010010B=0000 0100 1101 0010B
-1234 的存放形式为:
1111 1011 0010 1101+1=1111 1011 0010 1110
例:求 1234 和- 1234 的存放形式
2. 整型变量的分类 根据占用内存字节数的不同,整型变量又分为4类:( 1)基本整型(类型关键字为 int)。( 2)短整型(类型关键字为 short)( 2)长整型(类型关键字为 long [int])。又分为无符号整型 (unsigned)与有符号整型(默认类型)。无符号型:最高位仍用来存放数据整型变量所占存放空间: short≤int≤longTurbo C中分别为: 2,2, 4Visual C++中分别为: 2,4, 43. 整型变量的定义
int a,b;
long c;
unsigned d;
#include<stdio.h>
void main(){
short i=65538;
int j=-1234;
long k=65538;
printf("%d,%d,%d",sizeof(short),sizeof(int),sizeof(long));
printf("\n%d,%u,%ld\n",i,j,k);
}
Visual C++ 中的运行结果为:
2,4,4
2,4294966062,65538
例 3.2 整型变量的定义与使用#include<stdio.h>void main()
{int a,b,c,d;
unsigned u;
a=12;b=-24;u=10;
c=a+u;d=b+u;
printf("a+u=%d,b+u=%d\n",c,d);
}
4. 整型数据的溢出:注意各种类型变量的取值范围
例 3.3 整型数据的溢出
main()
{int a,b;
a=32767;
b=a+1;
printf("%d,%d",a,b);
}
32767=215-1=(0111 1111 1111 1111)B
32768= 215=(1000 0000 0000 0000)B
-32768 的补码为:
(0111 1111 1111 1111)B+1
3.4 实型数据3.4.1,实型常量的表示方法实型常量即实数,在C语言中又称浮点数,其值有两种表达形式:( 1)十进制形式。例如 3.14、 9.8。 ( 2)指数形式: <尾数 >E( e) <整型指数 >。例如 3.0E +5等。 3.4.2 浮点型变量
1。实型数据在内存中的存放形式
一个实数在内存中占 4个字节(一个字节为 8个二进制位),其存放形式为:用一个部分位如 24位存放小数,用其余位存放指数部分。如 3.14159,小数部分为 0.314159,指数部分为 1
2。实型变量的分类名称 类型标识符 位数 有效数字 数值范围
单精度型 float 32 6 - 7 -3.4×10-38
~3.4 ×1038
双精度型 double 64 15 - 16 -1.7×10-308
~1.7 ×10308
长双精度型 long double 128 18 - 19 -1.2×10-4932
~1.2 ×104932
float x,y;
double z;
3 ,实型数据的舍入误差
在计算机中实型数据并不是总能准确表示。如 float 型数据只有 6 - 7 位是有效的。
例 3.4 :实型数据的舍入误差#include<stdio.h>void main(){
float a,b;a=123455.789e5;b=a+20;printf("a=%f,b=%f",a,b);
}
运行结果为: a=12345578496.000000,b=12345578516.000000
3.4.3 实型常量的类型
许多系统将实型常量作为双精度型数据进行运算,然后再将结果取 7 位有效数字。
若在实型常量后面加一个 f ,则此常量不会转换成双精型常量。
如: 1.65f , 654.321f
3.5 字符型数据3.5.1 字符常量1.字符常量的定义用一对单引号括起来的单个字符,称为字符常量。例如,‘ A’、‘1’、‘+’等。2.转义字符 C语言还允许使用一种特殊形式的字符常量,就是以反斜杠“ \ ”开头的转义字符 注意:如果反斜杠或单引号本身作为字符常量,必须使用转义字符:‘ \\’、‘ \’‘。
字符形式 含义 ASCII 码\n 换行,将当前光标移到下一行开头 10
\t 水平制表,跳到下一个 Tab 位置 9
\b 退格,将当前光标向后退一位 8
\r 回车,将当前光标移动到当前行首 13
\f 换页,移动到下一页开头 12
\\ 反斜杠 92
\' 单引号 39
\" 双引号 34
\ddd 1 到 3 位 8 进制数所代表的字符
\xhh 1 到 2 位十六进制数所代表的字符
表 3.3 转换字符及其含义
例 3.5 转义字符的使用
#include<stdio.h>
void main()
{
printf(" ab c\t de\rf\tg\n");
printf("h\ti\bj k\n")
printf("\tY\b=");
}
\t: 制表区占 8 列
a 在第 2列输出 d 在第10列输出
字符变量的类型关键字为 char,一般占用 1字节内存单元字符变量的定义格式: char 字符变量名表;如: char c1,c2;字符变量的赋值:字符变量名=字符常量;或:字符变量名=正整数;如: c1='a';c2=97;c1='\103';变量的输出: printf("%c",c1);
3.5.2 字符变量
字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的 ASCII码值(无符号整数)存储到内存单元中。如
c1='A'的存储方法为: 01000001
字符型数据可以以字符型( %c)格式输出字符或整型格式( %d)输出其 ASCII码。字符型数据可以进行算术运算。
3.5.3 字符数据在内存中的存储形式及使用方法
例 3.6 向字符变量赋以整数
#include<stdio.h>
void main()
{char c1,c2;
c1=97;c2=98;
printf("%c %c\n",c1,c2);
printf("%d %d\n",c1,c2);
}
输出结果: a b
97 98
#include<stdio.h>
void main()
{char c1,c2;
c1='a';c2='b';
printf("%c %c\n",c1,c2);
printf("%d %d\n",c1,c2);
}
例 3.7 大小写字母的转换
#include<stdio.h>
void main(){
char c1,c2;
c1='a';c2='B';
c1=c1-32;c2=c2+32;
printf("%c%c",c1,c2);
}
输出结果为: Ab
1.字符串常量的概念和字符串长度
字符串常量是用一对双引号括起来的若干字符序列。
字符串中字符的个数称为字符串长度。长度为 0的字符串(即一个字符都没有的字符串)称为空串,表示为 "" (一对紧连的双引号 )
例如, "How do you do."、 "Good morning."等,都是字符串常量,其长度分别为 14和 13(空格也是一个字符)。 如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。
例如:( 1) C:\msdos\v6.22 → "C:\\msdos\\v6.22" ( 2) I say:"Goodbye!" → "I say:\"Goodbye!\""
3.5.4 字符串常量
2.字符串的存储C语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个‘ \0’作为字符串的结束标志。注意:在源程序中书写字符串常量时,不必加结束字符‘ \0’,否则画蛇添足。 如果有一个字符串为“ CHINA”,则它在内存中的实际存储如下所示:
最后一个字符 '\0'是系统自动加上的,它占用6字节而非5字节内存空间。
C H I N A \0
字符常量 'A'与字符串常量 "A"的区别:
( 1)定界符不同:字符常量使用单引号,而字符串常量使用双引号;
( 2)长度不同:字符常量的长度固定为 1,而字符串常量的长度,可以是 0,也可以是某个整数;
( 3)存储要求不同:字符常量存储的是字符的 ASCII码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志’ \0’。
没有赋值的变量其值是不确定的变量赋值的格式为: 变量名=表达式
如: a=4;b=5;c='a';
变量的初始化:定义的同时赋值。如
int a=65,b;
char c1='d';
3.6 变量赋初值
当两个不同类型数据间进行运算时,系统会自动将较低的数据类型转换成较高的数据类型
低------------->高
char->int->unsigned->long->float->double
例:求下列表达式的值:
7/2 7.0/2 7.0/2.0 7/2*2
3.7 各类数值型数据间的混合运算
3.8.1 C 运算符简介:包括 13 类1.算术运算: + - * / %2.关系运算: >, <, >=, <=, ==, !=3.逻辑运算: !, &&, ||4.位运算: <<, >>, ~,| ^ &5.赋值运算符:=及其扩展运算符如 +=等6.条件运算符: ? :7.逗号运算符:,8.指针运算符: *,&9.求字节运算符: sizeof10.强制类型转换: (类型 )11.分量运算符: . ->12.下标运算符: []13.其它 ( )
3.8 算术运算符和算术表达式
3.8.2 算术运算符和算术表达式1. 基本算术运算符 +、 -(减法 /取负)、 *、 /、 %(求余数)( 1)关于除法运算 /
C语言规定:两个整数相除,其商为整数,小数点和小数部分被舍弃。例如, 5 / 2 = 2。 -5/2=-2( 2)关于求余数运算%要求两侧的操作数均为整型数据,否则出错。( 3)如果参加 +,-,*,/运算的两个数中有一个实数,则结果是 double型。
2. 算术表达式和运算符的优先级与结合性
( 1)表达式的概念
用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合C语言语法规则的式子,称为表达式( 2 )算术表达式的概念
表达式中的运算符都是算术运算符。
例如, 3 + 6 * 9 、 (x + y) / 2 - 1 等,都是算术表达式
( 3 )运算符的优先级与结合性
1 )C语言规定了运算符的优先级和结合性。
所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。
结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。
2 )表达式求值按运算符的优先级高低次序执行。例如,先乘除后加减。如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。 例如,算术运算符的结合方向是“自左至右”,即:在执行“ a – b + c” 时,变量 b 先与减号结合,执行“ a - b” ;然后再执行加 c 的运算。
3,强制类型转换运算符数据类型强制转换的一般格式为: (要转换成的数据类型 )(被转换的表达式 )当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。例如,(double)a (等价于 (double)(a)) //将变量 a的值转换成double型(int)(x + y) //将 x+y的结果转换成 int型(float)5/2 //(等价于 (float)(5)/2) (float)(5/2) // 将 5 整除 2 的结果( 2 )转换成实型( 2.0)
注意:强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。例如, (double)a 只是将变量 a的值转换成一个 double型的中间量,其数据类型并未转换成 double型。
4. 自增、自减算术运算
i++, ++i i=i+1
i--, --i i=i-1
++i 与-- i 为前缀运算,若表达式中有前缀运算则应先
对变量进行自加减,然后用新的变量值代入表达式中
i++ 与 i --为后缀运算,若表达式中有后缀运算则应先
用新的变量值代入表达式中,然后对变量进行自加减,
其中 i 必须为整型变量,不能是表达式或常量
例如int i=5;
y=++i;
又如int i=5;
y=i ++ ;
又如int i=5;
y=(++i)+ (++i)+(++i);
相当于++i;++i;++i;
y=i+i+i; /*y=24*/
又如int i=5;
y=(i++)+ (i++)+(i++);
相当于y=i+i+i;
i++;i++;i++;
#include<stdio.h>
void main(void)
{int m,n;
m=8;n=10;
printf("%d,%d,%d,5d",m,n,m++,n++);
}
3.9 赋值运算与赋值表达式1. 赋值运算 赋值符号“ =” 就是赋值运算符,它的作用是将一个表达式的值赋给一个变量。 赋值运算符的一般形式为: 变量 = 赋值表达式 例如, x = 5 y = (float)5 / 2
如果表达式值的类型,与被赋值变量的类型不一致,但都是数值型或字符型时,系统自动地将表达式的值转换成被赋值变量的数据类型,然后再赋值给变量。
思考题:假设变量 num 的数据类型为 float ,其值为 2.5 ,则执行“ num = (int)num” 后, num 的值等于多少?
3. 复合赋值运算符一般形式: 变量 双目运算符 = 表达式 └──┬──┘ 复合赋值运算符它等价于:变量 = 变量 双目运算符 ( 表达式 ) 。a+=b a=a+b
a-=b a=a-b
a*=b a=a*b
a/=b a=a/b
a%=b a=a%b
C语言提供一种用逗号运算符“,”连接起来的式子,称为逗号表达式。逗号运算符又称顺序求值运算符。1.一般形式 表达式1 , 表达式2 , ……, 表达式 n2.求解过程自左至右,依次计算各表达式的值,“表达式 n” 的值即为整个逗号表达式的值。例如,逗号表达式“ a = 3 * 5, a * 4”的值 =60:先求解 a = 3 * 5,得 a=15;再求 a * 4 = 60,所以逗号表达式的值 =60。又例如,逗号表达式“ (a = 3 * 5, a * 4), a + 5”的值 =20:先求解 a = 3 * 5,得 a=15;再求 a * 4=60;最后求解 a + 5=20,所以逗号表达式的值 =20。注意:并不是任何地方出现的逗号,都是逗号运算符。很多情况下,逗号仅用作分隔符。
3.10 逗号运算符和逗号表达式
作业 3.3 , 3.4 , 3.6 , 3.7,
3.9 3.10 3.12