1
3.1 C的数据类型 短整型 (short)
整型 (int)
长整型 (long)
整型实型数值类型字符类型 (char)
枚举类型 (enum)
数组类型结构体类型 (struct)
共用体类型 (union)
文件类型 (FILE)
基本类型数据类型单精度型 (float)
双精度型 (double)
第三章 数据类型、运算符与表达式构造类型指针类型空类型
2
一 常量
1,常量 — 程序运行过程中其值不变的量
2,类型
(1) 整型常量,允许用 10进制,8进制 (数前加数
0),16进制(数前加数字 0和 X)
例 1 main ( )
{ int a,b,c;
a=10; b=010;
c=0x10;
printf(,%d,%d,%d \n”,a,b,c);
}
3.2 常量与变量运行结果,10,8,16
3
(2) 实型常量,
日常记数法,如,1999.35,-2001.98
错误如,e2.5,e8 e8 e
科学记数法:如,1.99935e3两种形式运行结果,1999.35,1.99935e3
例 2 main ( )
{ float f ;
f = 1999.35 ;
printf (,%f,%e \n”,f,f ) ;
}
4
(3)字符常量 — 用单引号括起来的一个字符或转义字符,
例,?A?,?o?,?1?,?#?,?a?等
\n 换行
\t 横向跳格 (即跳到下一个输出区 )
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜杠
\? 输出单引号
\ooo 1--3位 八 进制所代表的字符
\xhh 1--2位 十六 进制所代表的字符转义字符 含义
5
(4) 字符串常量 ---用双引号括起来的一串字符序列,
例:,CHINA”,“BBI”,“I am a teacher.” 等而,A” 与 ‘ A? 在 C语言中是不同的,前者是字符串常量,
后者是字符常量.
在内存中,
A?,A”
01000001
例:
main ( )
{
printf(“%c,%c,%c,%c\n”,?A?,?\101?,?\0101?,?\0x41?) ;
}
01000001
\0
是字符串结束标记,输入时,系统自动加上,输出时不输出运行结果,A,A,A,A
6
(5)符号常量
#include <stdio.h>
# define PI 3.1415928 /* PI是符号常量,一般用大写,在该作用域内不可赋其他值 */
void main ( )
{ float r,s;
scanf (,%f,,&r);
s=2*PI*r;
printf (,s=%f \n,,s);
}
好处,若程序里多处出现,该值发 变化,
仅在 define中作一次修改
7
二 变量
1,变量 -----程序执行过程中其值可以发生变化的量
2,起名规则,在 C中变量名,函数名,文件名,数组名,等均称 标识符 (identifier),可由字母,数字和下划线组成,且 第一个必为字母或下划线 (系统常用 ),前 8或 31个有效 (视不同版本而定 )
注意,大小写字母有区别 ; 如,a1与 A1为不同的变量名不可用关键字 ; 如,int,for,if 等不可出现空格 ; 如,stu 1,a 1等见名知意 ; 如,sum,sort 等
3,类型及定义在 C中 用变量前一定先定义,编译系统对不同类型变量分配不同数量的内存单元,存放其值 ; 系统对不同类型变量进行不同操作,
8
变量类型 定义 字节数 范围整型 int a,b; 2 -32768---32767
短整型 short x,y; 2 -32768--32767
无符号整型 unsigned int a; 2 0--65535
无符号短整型 unsigned short b; 2 0--65535
长整型 long l; 4 -2147483648--2147483647
无符号长整型 unsigned long d; 4 0--4294967295
单精度实型 float f; 4 3.4e-38 ~ 3.4e38(7位 )
双精度实型 double d; 8 1.7e-308 ~ 1.7e308(15位 )
长双精度实型 long double ld; 10 3.4e-4932~3.4e4932(19位 )
字符型 char c1,c2; 1 0--255
带符号字符型 signed char c3; 1 -128--127
9
三 运算符及其表达式
1,算术运算符及其表达式
(1) 算术运算符,+,-,*,/,%
两个操作数均为整型,其结果为整型有一个操作数为实型,其结果为双精度实型
% (求余 ),两个操作数必为整型,其结果为余数
main ( )
{ int a,b; float c;
scanf (,%d,%d,%f,,&a,&b,&c);
printf (,a+b=%d \n,,a+b);
printf (,a-b=%d \n,,a-b);
printf (,a/c=%f \n,,a/c);
printf (,a%%c=%d \n,,a%(int) c);
}
注意:如果要输出,%”
号,则在其前加,%” 号
/:
10
(2) 算术表达式 -- 用算术运算符将可操作对象连接起来算式,
例,a,100,a+100,a+3/2.0…,均是算术表达式,
优先级 3+2*5 先,*” 后,+” 其结果为,13;
先,+” 后,*” 其结果为,25;同一算式得出两个结果,这就要规定优先级,
C中规定算术运算符 优先级,
( )--改变优先级 如,(3+2)*5,其结果为,25
( ) 可嵌套,不可用{}和[ ].
结合性 同一级别有结合性 * / % + -
左 ——>右 左 ——>右
11
c/b/a (c/b)/a -1
d/b%a (d/b)%a 0
-a*d (-a)*d 38
a% -b*c (a%(-b))*c 14
a/c+ -20/-a (a/c)+((-20)/(-a)) 10
-d%c -b/a*5+5 ((-d)%c)-((b/a)*5)+5 15
7 -a%(3+b) 7-(a%(3+b)) 出错 (分母为 0)
算术表达式 等价表达式 表达式的值已知,a,b,c,d 均是整型变量,其值是,a=2,
b= -3,c=7,d= -19; 试分别写出下列各表达式的值,
12
(3) 不同类型数据混合运算,C允许混合运算,系统自动按以下规律转换 (即字节数少的转换成字节数多的 )
double float
long
unsigned
int char,short
13
例,
#include <stdio.h>
void main ( )
{ int a = 1;
char c1 =?A?;
float f = 100;
double d =200.0;
long m = 40000;
printf(,%f,,a+c1+f+d); /* a,c1,f 均转成 double 后再相加 */
printf(,%ld,,a+m); /* a 转成 long 后与 m 相加 */
printf(,%f,,a+c1); /* c1 转成 int 后与 a 相加 */
printf(,%f,,c1+d); /* c1转成 double 后与 d 相加 */
}
14
运行结果,A,B,C
B,C,D
65,66,67
/* 字符型与整型可以作算术运算 */
#include <stdio.h>
void main ( )
{ char c1,c2,c3;
c1=?A?; c2=?B?; c3=?C?;
printf(,%c,%c,%c\n,,c1,c2,c3);
printf(,%c,%c,%c\n”,c1+1,c2+1,c3+1);
printf(,%d,%d,%d\n”,c1,c2,c3);
}
15
#include <stdio.h>
void main( )
{ int a1,a2,a3;
a1=97; a2=98; a3=99;
printf(,%c,%c,%c\n,,a1,a2,a3);
printf(“%c,%c,%c\n”,a1+1,a2+1,a3+1);
}
运行结果,a,b,c
b,c,d
/* a1,a2,a3 分别为‘ a?,
b?,?c? 的 ASCII 码 */
/* 整型值可按 c格式输出一个字符 */
16
a=100
x+=2 (与
x=x+2等价 )
++i
i++
i--,--i
运算符 表达式 功能 举例当前变量的值与表达式值进行操作后结果赋给变量当前变量的值先增 (或减 )1
后赋给变量,变量先参加操作,后再做增 (减 )1的修改
= <变量名 >=<表达式 > 计算表达式的值,将值赋给变量,
+=,-=,*= <变量名 >
/=,%= 等 <复合赋值运算符 >
<表达式 >
++ -- ++<变量名 1>
(自加、自减 <变量名 1>++
运算符 ) - - <变量名 1>
<变量名 1>- -
注,<表达式 >,指在 C中可出现的任何一种表达式
<变量名 1>,只可是 int,char,long,指针型 ; 不可是 float,double型 ;
自增自减仅可增,减 1
2,赋值,复合赋值,自增,自减运算符及其表达式,
自增自减优先级为 2,赋值和复合赋值优先级为 14,其结合性均是从右到左
17
例 i=3; j=5;
a=(++i)*j;
a=(i++)*j;
i=i+1=4 a=4*5=20
a=3*5=15 i=i+1=4
注意,自加,自减的运算量只能是整型变量,不能是常量或表达式 如 8++ (x*y)++ 是 错误的。
例 k=3;
j= -++k;
j= -k++;
j= -(++k); k=4 j= -4
j= -(k++); j= -3 k=4
表达式使用的说明,
1,表达式的求值顺序在不同的编译系统中可能不同例,i=3;
y=(i++)+(i++)
① y=6 i=5 y=3+3; i++; i++;
② y=7 i=5 y=3+4; i++;
18
2.容易造成误解的写法例 1,i=3; j=1;
x=i+++j;
① x=i+(++j); x=5 i=3 j=2
② x=(i++)+j; x=4 i=4 j=1
因为 C编译系统在处理时尽可能多的从左至右将若干个字符组成一个运算符,所以第②种理解是对的例 2,i=3; j=1;
x=i-++j ; 等价于 x=i-(++j); x=1 i=3 j=2
例 3,i=3;
printf(“%d,%d”,i,i++);
可能输出,① 3,3
② 4,3
因为在我们使用的 bc31系统中 对函数参数的求值顺序是从右至左,所以 printf函数中先求第 2个表达式
i++的值,再求第 1个表达式的值,最后的输出结果是,
4,3
19
int i float 舍去小数部分,如表达式值,10.53,则 i 的
double 值,10
float f 补足到有效位数 7位,如表达式值,10,
则 f 的值,10.00000
double d 补足到有效位数 15位,如表达式值,10,
则 d 的值,10.0000000000000
int i char 将表达式值的高 8 位全补 0 后赋给 i,
signed char 若表达式值的最高位为 0,则高 8位全补
0; 否则全补 1 后赋给 i
若表达式值是正数,高 16 位全补 0;否
long l 则全补 1 后赋给 l
int i long int 截取表达式值的低 16 位后赋给 i
long int l unsigned int 将表达式值的高 16 位全补 0后赋给 l
unsigned int i signed int 将表达式值直接赋给 i
变量类型 表达式值类型 说明当表达式值的类型与变量类型不同时,系统将按以下规律处理,
int
int
20
#include <stdio.h>
void main ( )
{ int a,b,c,d,e;
a=b=c=d=30; e=32;
printf(“a+3=%d\n,,a += 3);
printf(“b-3=%d\n,,b -= 3);
printf(“c*3=%d\n,,c *= 3);
printf(,d/3=%d\n,,d /= 3);
printf(,e%%3=%d\n,,e %= 3);
printf(,%d,%d,%d,%d,%d\n,,a,b,c,d,e);
}
#include <stdio.h>
void main ( )
{ int x=2;
x+=x-=x*x; /* 结合性是自右至左 */
printf (,x=%d\n,,x);
} 运行结果,x= - 4
运行结果,
a+3=33
b-3=27
c*3=90
d/3=10
e%3=2
33,27,90,10,2
等价于,x=x-x*x;
x=x+x;
21
#include <stdio.h>
void main ( )
{ int x=100;
printf (,%d,%d,%d,%d \n,,x++,x,- -x,x);
printf (,%d \n,,x);
} 运行结果,99,99,99,100100
#include <stdio.h>
void main ( )
{ int a,b,c;
a=b=c=0;
a=++b + ++c;
a=b++ + c++;
a=++b + c++;
a=b- - + - -c;
printf(,%d,%d,%d\n,,a,b,c);
}
/* b,c 均先增 1,后相加 a=2 b=1 c=1 */
/* b,c 先相加,后均增 1 a=2 b=2 c=2 */
/* b先增 1和 c 相加,后 c再增 1 a=5 b=3 c=3*/
/* c 先减 1和 b 相加,后 b减 1 a=5 b=2 c=2*/
运行结果,5,2,2
22
3,逗号运算符及其表达式逗号运算符,,其优先级最低,结合性是自左至右逗号表达式格式,<表达式 1>,<表达式 2>,…< 表达式 n>
计算逗号表达式值是按自左至右的顺序,先计算 <表达式
1>的值,再计算 <表达式 2>的值,...而 逗号表达式值是最后一个 <表达式 n>的值,
23
#include <stdio.h>
void main ( )
{ int a,b,c;
a=1,b=2,c=3;
printf(,%d,%d,%d\n,,a,b,c);
printf(,%d,%d,%d\n,,(a,b,c),b,c);
a=(c=0,c+5);
b=(c=3,c+8);
printf(,%d,%d,%d\n,,a,b,c);
}
/* 该处 a,b,c不是逗号表达式,
是 printf 函数的参数 */
/* (a,b,c) 是逗号表达式 */
运行结果,1,2,3
3,2,3
5,11,3
24
#include <stdio.h>
void main ( )
{ int a,b,c,d;
a=(c=100,d=200,c+d);
b=(c=d=0,c+50);
printf(,%d,%d,%d,%d\n,,a,b,c,d);
}
运行结果,300,50,0,0
25
注意,逗号运算符的优先级最低
x=(a=3,6*3) ; 与 x=a=3,6*3 ; 的不同
① a=3
② 6*3 得 18
逗号表达式的值为 18
③ x=18
① a=3
② x=3
③ 6*3 得 18
逗号表达式的值为 18
但 x 的值为 3
26
课后作业:
习题 3.8,3.10,3.12