第三章 数据类型、运算符与表达式任课老师:台安第三章 数据类型、运算符与表达式本章要求
本章有关常量、变量、运算符、表达式的细节非常多,它们不是程序设计的最重要的内容,但细节错误也导致程序最终错误,因此,还是要引起注意。
细节不能死记,要注意本质概念;对于无把握的细节,要在 Turbo C中进行测试。
第三章 数据类型、运算符与表达式第二章 数据类型、运算符与表达式
2.1 C的数据类型
2.2 常量与变量
2.3 整型数据
2.4 实型数据
2.5 字符型数据
2.6 变量赋初值
2.7 各类数值型数据间的混合运算
2.8 算术运算符和算术表达式
2.9 赋值运算符和赋值表达式
2.10 关系运算、逻辑运算、条件运算
2.11 逗号运算符和逗号表达式第三章 数据类型、运算符与表达式
2.1 C的数据类型
程序的构成:数据 +对数据的处理。
计算机科学家沃思( Nikiklaus Wirth)提出的公式:数据结构 + 算法 = 程序考虑程序设计方法和使用的语言及开发环境,表达为:程序 = 算法 + 数据结构
+ 程序设计方法 + 语言工具和环境第三章 数据类型、运算符与表达式
C语言提供的数据元素的类型:
第三章 数据类型、运算符与表达式
2.2 常量与变量
常量是指在程序执行期间值不能变化,具有固定值的量;
变量则是其值可以变化的量,实际上变量命名了的内存中指定的存储单元。
第三章 数据类型、运算符与表达式
2.2 常量与变量
2.2.1 常量和符号常量
常量:
整型 如,3,5,0,-9
实型 如,1.2,.125,56.23
字符型 如,'a','?',':'
符号常量;用指定的字符串代表一个常量,一般是大写字符第三章 数据类型、运算符与表达式符号常量的使用
例 2.1
#define PRICE 30
main( )
{ int num,total ;
num=10 ;
total= num * PRICE ;
printf("total=%d",total) ;
}
第三章 数据类型、运算符与表达式
2.2.2 变量
变量的定义:在程序运行过程中,其值可以被改变的量。
变量用标识符(以字母、数字、下划线组成,且第一个字符必须为字母或下划线)表示。
变量在内存中占据一定的存储单元。变量名的类型表明存储单元的数量
合法变量名,sum,average,class,day,month,student_name,
_above,lotus_1_2_3,basic
不合法的变量名,M.D.Jhon,$123,#33,3D64,a>b
变量名的长度,C语言中未统一规定,随不同开发系统而变。
第三章 数据类型、运算符与表达式
2.3 整型数据
整型常量
十进制,123,- 456,0
二进制,1001,1010,0011
八进制,以 0(零 )开头的数 044,0101
十六进制,以 0X开头的数
0x24,0x41
第三章 数据类型、运算符与表达式
字符 char 1个字节 0—255
整型
int 2个字节 -32768~+32767
short 2个字节 -32768~+32767
long 4个字节 -2147483648 ~ +2147483647
实型
单精度 float 4个字节
7位有效数字 -10-38—10+38
双精度 double 8个字节
16位有效数字 -10-308—10+308
第三章 数据类型、运算符与表达式常量的默认类型
1.在没有任何标志的情况下,按照常数所在范围决定其类型。如:
25,-360,32767 等为整型( -32768~32767)
-65535,80000 等为长整型
'a','b','x' 等为字符型特例,1.2,-3.5等带小数的均被视为 double型。
2.后缀标识法
l,表示 long型。 如 30l,-5l 等
u:表示 unsigned型。如 110u,8u 等
f:表示 float 型。 如 3.14f,-97.33f 等第三章 数据类型、运算符与表达式二、整型变量的定义
int a,b ; /* 指定变量 a,b为有符号的( signed)整型 */
unsigned short c,d ; /*指定变量 c,d为无符号短整型 */
long e,f ; /* 指定变量 e,f为长整型 */
程序中在函数的开头部分定义变量。
第三章 数据类型、运算符与表达式
[例 2.2]
main( )
{ int a,b,c,d; /* 指定变量 a,b,c,d为整型 */
unsigned int u; /* 指定变量 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
第三章 数据类型、运算符与表达式
2.4 实型数据
2.4.1 实型常量
实数( real)又称为浮点数( float),有两种表达方式,0.123,.123,123.0,123.,0.0
(必须有小数点) 123e3或 123E3,123E-2
只能用十进制形式表示;可以小数形式 3.45,或指数形式 3.45e-1
第三章 数据类型、运算符与表达式
2.4.2 实型变量
单精度实型变量
float 4字节,占内存单元 (32位 )
双精度实型变量
Double 8字节,占内存单元 ( 64位)
例:
float x,y ; /* 指定 x,y为单精度实型变量 */
double z ; /* 指定 z为双精度实型变量 */
实型常量默认为 double类型。
第三章 数据类型、运算符与表达式
2.5 字符型数据
2.5.1字符常量
字符常量的定义,用 单引号 (撇号 )括起来的一个字符 。
如,'a','x','D','?','$'。 注意,'a'和 'A'是不同的字符常量 。
转义字符,用反斜杠开头后面跟一个字母代表一个控制字
\n换行 \t 跳格 \ b退格 \r回车
也可以用 \后 3位 8进制数或 \x后 2位十六进制数 \xhh
表示任一 ASCⅡ 字符 。
第三章 数据类型、运算符与表达式转义序列一览表字符形式 功能
\n 换行符
\t 横向跳格:跳到下一个输出区(每一输出区为 8
个字符位置)
\v 竖向跳格
\b 退格
\r 回车(回到本行起始字符位置)
\f 走纸换页
\\ 反斜杠字符 \
\' 单引号 (撇号 )'
\ddd 1~3位八进制数所代表的字符。如
\101表示 'A'
\xhh 1~2位十六进制数所代表的字符。如 \x41
表示 'A'
第三章 数据类型、运算符与表达式
2.5.2 字符变量
char c1,c2 ; /* 定义 c1,c2为字符变量 */
c1 = 'a' ; c2 = 'b' ; /*字符变量在内存中占一字节 */
[例 2.4]
main( ){
char c1,c2 ;c1 = 'a'; c2 = 'b';
c1 = c1 - 32; c2 = c2 - 32; printf("%c %c",c1,c2);
}
[例 2.3]
main( )
{
char c1,c2 ;
c1 = 97 ; c2 = 98;
printf("%c %c",c1,c2);
} 该例的输出是,a b
字符以 ASCII码存储,其存储方式与整数类似。从而,C语言允许字符和整数之间进行运算。
第三章 数据类型、运算符与表达式
2.5.2 字符串常量
字符串常量:用 双引号 括起来的字符序列( 0~N个字符)。
如,"How do you do.","CHINA","a","$123.45"
字符串常量在内存中的存放:每一个字符均以其
ASCII码存放,且最后添加一个 结束标记,空字符,
(二进制 00000000,记为 \0。注意和字符 '0'的区别,
'0'在内存中存为 0x30即 00100000)。
例:字符串常量 "CHINA"存放在内存中的情况是,(6字节存储器,不是 5字节 )
字符 'a'和字符串 "a"的区别是:
字符 'a',1字节(值为 97)
字符串 "a",2字节(值为 97,0)
97
97 \0
C H I N A \0
第三章 数据类型、运算符与表达式
2.6 变量和变量赋值
变量和变量的存储
每一个变量都有一个名字,每一个变量都有相应的数据类型,每一个变量都对应内存中的一个存储空间,这个存储空间的首地址就是这个 变量的地址,
该空间存储的数据,即该 变量的值 。
...
...
内存
int a,b;
a=10;
a=a+1;
b=a;
b=a+b;
a
1011b 运算器
1
1122
执行后 a,b的值?
第三章 数据类型、运算符与表达式注意:多个变量指定相同的初值
int a = 3;
(指定初值是在程序运行时完成的,不是在编译时完成)。
int a,b,c;
a= b= c = 3 ;
int a = b = c = 3;
int a,b,c=5;
可改为:
int a = 3,b = 3,c = 3;

int a,b,c ;
a= b= c= 3 ;
相当的两条语句:
int a;
a = 3; /* 运行时执行赋值语句 */
相当的语句
int a,b,c ;
c = 5 ;

第三章 数据类型、运算符与表达式变量的声明
标识符:是给程序中的实体 — 变量、常量、
函数、数组、结构体以及文件所起的名字。
标识符的命名规则:
⑴以字母或下划线开头,由字母、数字或下划线组成的字符序列;
⑵ C语言有 32个关键字,用户不能作为标识符使用;
⑶大写和小写是两个不同字符;
⑷标识符的长度,有长有短;
⑸尽量不用下划线开头
原则:⑴可读性的
⑵标识符尽量小写,符号常量大写;
第三章 数据类型、运算符与表达式
变量在内存中占据一定的存储单元。变量名的类型表明存储单元的数量
整型变量 int,占 2字节存储单元。
单精度实数 float,占 4字节存储单元;
变量名表示存储单元的值(该值在程序运行过程中可能随时变化)。可以用运算符 &取得变量所在存储单元的地址。
一种数据类型对应于一个数据范围
main( )
{
int a ; float b ;
a = 5 ; b = 3.14159 ;
printf("adress:%x,value:%d ;adress:%x,value:%f\n",&a,a,&b,b);
}
例 2.5
第三章 数据类型、运算符与表达式变量的声明的示例
int x,y;
char ch1,ch2;
short s1,s2;
float f1,f2;
long x1,x2;
double d1,d2;
指定变量 x,y为整型指定变量 ch1,ch2为字符型指定变量 s1,s2为短整型指定变量 f1,f2为浮点型指定变量 x1,x2为长整型指定变量 d1,d2为双精度型第三章 数据类型、运算符与表达式声明变量的要注意的地方
所有的变量必须,先声明,后使用
在声明变量的同时可赋初值 —初始化;
int a=23;
float f=3.56
一个变量不能重复定义,更不能说明成不同的数据类型 。
×
int a;
int a=5;
第三章 数据类型、运算符与表达式
2.7、不同类型数据间的转换
1,不同类型的数据在混合运算时,先转换成同一类型的数据之后再进行运算 。 转换的规则如图,
double ← float

long

unsinged

int ← char short
⑴ 转换成表达式中数据类型最长的数据类型 。
⑵ 横向必定转换之 。
(3)箭头只表示转换方向,不表示严格步骤 。
如 int?double,直接转换,不经过中间过程,
低高第三章 数据类型、运算符与表达式
例,int i=2; float f=3.14; double d=5.4; long e=3;
10+‘ a‘+i * f – d / e
上式的运算次序是:
① 进行 10+'a'运算。先将 'a'转换为整数 97,运算结果为整数 107。
② 进行 i*f运算。先将 i和 f均转换为 double类型,运算结果是 double类型,值为 6.28。
③ 整数 107与 i*f的积相加。先将整数 107转换为 double类型( 107.0),运算结果是 double类型,值为 113.28。
④ 进行 d/e运算。先将 long e转换为 double类型 (3.0),运算结果是 double类型,值为 1.8。
⑤ 进行③ -④运算,结果为 double类型,值为 111.48。
注意:上述转换过程是由系统自动完成的。
第三章 数据类型、运算符与表达式
2、给变量赋值时,等号右边数值的类型要转换成与左边变量一致的类型,再赋值。
几种情况,
⑴ 提升与降格
提升:由低级的数据类型转换为高级的数据类型
char→int →long→float→double
在提升的过程中,数据送入低位字节,高位字节扩充
0(正数 )或 1(负数 ).
如一字节的数据转换成两字节的数据:
10010001->
00010001->
11111111 10010001
00000000 00010001
第三章 数据类型、运算符与表达式降格,高级数据类型转换成低级数据类型,降格时会出现小数部分被舍弃,或者丢失精度,或者结果不确定,
左边 右边 转换情况
int float
double
舍弃实数的小数部分
int long 低 16位送入 int 型
float double 按四舍五入去掉多余的有效数字,
00000001 10001001
10001001
393
-119
数据溢出第三章 数据类型、运算符与表达式
2.6 数据溢出实例
main( )
{int a= 393;
char b;
b = a;
printf(―%d,%d‖,a,b); }
main( )
{long a=65535;
int b;
b = a;
printf(―%ld,%d‖,a,b); }
main( )
{float a=15.768;
int b;
b = a ;
printf(―%f,%d‖,a,b); }
main( )
{unsigned int a = 32768;
int b;
b = a;
printf(―%u,%d‖,a,b); }
第三章 数据类型、运算符与表达式
3.强制转换
形式,(数据类型 )变量名或运算式
例,main( )
{ float x=3.6;
int i;
i=(int ) x;
printf(―%f,%d\n‖,x,i);
}
这种转换,仅只是为了本次运算,并不能改变变量 x的值以及数据类型 。
输出结果是:
3.6 3
第三章 数据类型、运算符与表达式
2.8算术运算符和算术表达式
运算,即对数据的加工,这个加工用一些符号记述,即运算符,被运算的对象即数据称为运算量或操作数,
表达式,由运算符和运算量组成的一个式子,
描述了对数据以何种顺序,进行什么样的操作
(运算 )
第三章 数据类型、运算符与表达式
2.8.1,C语言的运算符简介
C语言的运算符有 13类
算术运算符,
+ - * / % ++ - -
加 减 乘 除 整除取余 自加 自减
关系运算符,
> < == >= <= !=
大于 小于 等于 大于等于 小于等于 不等于
逻辑运算符,
! && ‖
非 与 或
位运算符,
<< >> ~ | & ^
左移 右移 位反 位或 位与 位异或第三章 数据类型、运算符与表达式
赋值运算符,
= += -= *= /= %=
赋值 加赋值 减赋值 乘赋值 除赋值 求余赋值
条件运算符,?,
逗号运算符,,
指针运算符,* &
求字节数运算符,sizeof
强制类型转换运算符 (类型 )
分量运算,,→
下标运算符,[ ]
第三章 数据类型、运算符与表达式优先级与结合性 的概念
优先级,每一个运算符有不同的优先级,在表达式中,优先级高先运算,优先级低的后运算 。
结合性,当优先级相同的情况下,则按结合方向顺序处理 。
第三章 数据类型、运算符与表达式
2.8.2 算术运算符和算术表达式
㈠基本的算术运算符
+加法运算符,如 3+5
+正值运算符,如 +3
-减法运算符,如 5-2
-负值运算符,如 -3
* 乘法运算符,如 3*5
/除法运算符,如 5.6/2 = 2.8
%模运算符(或称求余运算符),如 7%4 =3
(此时 %前后的数据必须是整型)
第三章 数据类型、运算符与表达式特殊示例
main( )
{ long a;
a = 32767+1;
printf("\n a=%ld",a);
}
main( )
{ float a;
a = 3 /5 ;
printf("\n a=%f",a);
}
main( ) /*可改为 */
{ long a;
a = 32768; /*或 a=32767l+1*/
printf("\n a=%ld",a);
}
main( ) /*可改为 */
{ float a;
a = 3 /5.0 ; /*或 a=3.0/5 */
printf("\n a=%f",a);
}
输出,a= -32768 输出,a=0
第三章 数据类型、运算符与表达式二、算术表达式和运算符的优先级与结合性
算术表达式,用算术运算符和括号将运算对象(也称操作数,如常量、变量、函数等)连接起来、符合 C语法规则的式子。
如,a*b/c - 1.5 + 'a'
运算符的优先级,先乘除、后加减;先括号。
运算符的结合性,运算对象两侧的运算符优先级相同时,运算符的结合方向(左、右)。
左结合性:结合方向为从左至右(先左后右,简称左结合)。
算术运算符为左结合。
例,a - b + c( 由于算术运算符为左结合,故先执行 a-b,再执行加 c的运算。 )
右结合性:结合方向为从右至左(先右后左,简称右结合)。
赋值运算符 =为右结合。
例,a = b + c( 由于赋值运算符 =为右结合,先执行右边的 b+c,
再赋值给 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);
说明:强制类型转换时,得到一个所需类型的中间变量,原来变量的类型不发生变化。
例,( int) x /*变量 x的类型不发生变化。 */
第三章 数据类型、运算符与表达式
㈢自加和自减运算
++自增:使变量的值加 1;
--自减:使变量的值减 1。
优先级 ⑵ 级,结合性,从右 →左
i = i + 1 → i++
i = i - 1 → i- -
前置运算
++a,- -a 先加或减 1,后使用变量 a
后置运算
a++,a - - 先使用变量 a,后自身加或减 1
例,int a,b=1;
a= b++ ; /*先使用 b,将 b的值赋给 a,后 b的值增 1 */
a= - -b ; /*先 b的值减 1,再赋给 a。 */
第三章 数据类型、运算符与表达式注意:
( 1) ++和 --只能用于变量,不能用于常量和表达式。例、
5++;
(a+b)++;
#define ONE 1; ONE++;
( 2) ++和 --的结合方向为“右结合”。例:
-i++ (-i)++
-(i++)
负值运算符 -和自增运算符优先级相同例,int x,y=2;
x = - y ++ ;
printf(― %d %d ―,x,y) ; /* 输出 -2 3 */
第三章 数据类型、运算符与表达式有关表达式使用中的问题说明
1,在表达式中使用 ++或 --,容易出错。
2,出现多个运算符时,编译器在处理时尽可能多的(从左到右)将若干个字符组合成一个运算符。例
i = 3;
k = (i++) + (i++) + (i++)
k值等于 9。
i++,先使用 i,再加 1。
执行后,k = 3 + 3 + 3 = 9。
i = 6。
k = (++i) + (++i) + (++i)
k值等于 18。
++i,先加 1,再使用 i。
连续 3次使 i加 1后,i的值等于 6
k = 6+6+6 = 18;
i+++j; (i++)+ji+(++j)
第三章 数据类型、运算符与表达式有关表达式使用中的问题说明
3,Turbo C中,调用函数时,实际参数的处理顺序是从右到左(称为 C调用约定。实际参数的处理顺序从左到右,称为 PASCAL调用约定)。例:
菜单,Options|Compiler|Code generation|Calling
convention
i = 3;
printf("%d,%d",i,i++);
先右,i++,先使用 i(3),再使 i加 1。
后左,i( 现在值为 4)。
因此,输出结果,4,3
第三章 数据类型、运算符与表达式
2.9 赋值运算符和赋值表达式
一、赋值运算符,=
作用:将 右边表达式的值赋给左边的变量。例:
a = 3; /*常数 3赋给变量 a。 常数是特殊的表达式 */
a = b + c + 1; /*将变量 b和 c的和加 1后赋给变量 a.
二、赋值时的类型转换
当赋值运算符两侧的类型不同时,在赋值前进行类型转换。
1,float,double to int,舍弃小数(截断)。
2,int to float,double,值不变。
3,char( 1字节) to int( 2字节)值不变。
第三章 数据类型、运算符与表达式赋值时的类型转换
( 1) (unsigned char) int,赋给 int的低 8位,int的高 8位补
0。
( 2)( signed char) int,赋给 int的低 8位,若 signed char
的最高位是 0,则 int的高 8位全为 0;若 signed char的最高位是 1,则 int的高 8位全为 1。(称为“符号扩展”)
第三章 数据类型、运算符与表达式赋值时的类型转换
4,long int to int (截断 ) (注意符号位)
long int to int
5,unsigned int to int
6、数据位数相同的 signed to unsigned
第三章 数据类型、运算符与表达式三、复合的赋值运算符
复合赋值运算符 例子语句 等价语句
+= a += 3; a = a + 3;
*= x *= y + 8; x = x*(y+8)
%= x %= 3; x = x % 3;
第三章 数据类型、运算符与表达式四、赋值表达式
一般形式,<变量 > <赋值运算符 > <表达式 >
例:
赋值表达式,a = 5
赋值语句,a = 5;
赋值表达式中的“表达式”也可以是赋值表达式。例、
a = (b = 5) /* b的值等于 5,表达式 b=5的值等于 5,因此 a的值等于 5 */
a = b = 5 /* 与上述表达式的意义相同 */
例、
a = 5 + (c = 6) /* c=6,a=11 */
a = (b = 4) + (c = 6) /* c=6,b=4,a=10 */
a = (b = 10) / (c = 2) /* c=2,b=10,a=5 */
a += a -= a*a /* 先 a=a-a**,再 a=a+a */
第三章 数据类型、运算符与表达式
2.10 关系运算、逻辑运算、条件运算
1。 关系运算
1)关系运算是指对两个运算量之间的大小比较。如:
3>=2 5<4+1?a‘<?d‘ 1+5= =6
2) 关系运算符的优先级比纯运算类低,高于赋值类。
3)关系表达式只有两种:真和假。真用 1表示,假用 0表示。
例,int x=2,y= 3,z ;
z = 3 – 1 > = x + 1 <= y + 2
运算顺序,z = 2>= 3 <= 5
z = 0 <= 5
z = 1
第三章 数据类型、运算符与表达式
2.逻辑运算
运算符:
&&(与),||(或),!(非)
1)逻辑表达式的值也只有两种:真和假。
2)逻辑运算符的优先级比关系运算符的优先级低。
实例,int a=2 ;
2+1>1 && 6<=8 (真 ) a= =3 || (a> 3) (假 )
3)数学表达式 1<=a<=5 应表达为 a>=1 && a<=5,
4) 若逻辑表达式的值已经能确定时,表达式后面的部分就不再计算。如:
a = = 3 && (a= 3) (表达式值假,计算之后 a仍为 2)
a = = 3 || (a= 3) (表达式值真,计算之后 a为 3)
a = = 2 && (a= 3) (表达式值真,计算之后 a为 3)
第三章 数据类型、运算符与表达式
3。条件运算
条件运算是在两个表达式的之中选择一的操作。
一般形式,e1? e2,e3
操作过程:若 e1的值为真(非 0),则表达式的值为 e2的值,否则表达式的值为 e3的值。
如要把变量 a和 b的较大值送给变量 c,语句为:
c = a> b? a,b ;
条件运算符的优先级比赋值符的优先级高。
第三章 数据类型、运算符与表达式
2.11 逗号运算符和逗号表达式
逗号运算符:,
逗号表达式:用逗号运算符把两个表达式连接起来的表达式。其一般形式为:
表达式 1,表达式 2
例、
3+5,6+8 /* 是一个逗号表达式 */
逗号表达式的值等于“表达式 2”的值,但 C语言中使用逗号表达式的一般目的是分别获得两个表达式的值,
因此,逗号运算符又称为“顺序求值运算符”。
逗号表达式可以扩展为更一般的形式:
表达式 1,表达式 2,表达式 3,.....,表达式 n
例、
a = 3*5,a*4
(a=3*5,a*4),a+5 逗号的优先级别比赋值符号还要低第三章 数据类型、运算符与表达式区别:
逗号运算符在所有运算符中优先级最低
x = (a=3,6*3) /*赋值表达式 */
x = a =3,6*a /* 逗号表达式 */
逗号可以作运算符,也可以作分隔符
printf("%d,%d,%d",a,b,c); /* 逗号做分隔符
*/
printf("%d,%d,%d",(a,b,c),b,c);
/* (a,b,c)中的逗号是运算符,其余逗号是分隔符 */
第三章 数据类型、运算符与表达式课堂练习
2.16 2.17 2.18 2.19 2.20
第三章 数据类型、运算符与表达式作业与上机要求
作业:
2.2,2.3,2.4,2.5,2.9,2.10,2.12
上机要求:
1、进一步熟悉 Turbo C环境。
2、测试教材中的例题和布置的作业。