C语言程序设计
2002 年第二章 基本数据类型和运算
2.1 基本数据类型
数据是程序处理的对象,包括常量、变量、有返回值的函数。
不同性质的数据需要不同大小的存储空间,导致数据类型的划分,对某一编译程序而言,给各种数据类型分配固定大小存储空间,使其表示的数据值在一定的范围内,
称为数据类型的值域。
例,对短整型数,分配 2个字节,值域为 -32768~ 32767
数据类型是一组值和一组运算的集合。
2.1,1 C的数据类型类别 数据类型基本类型整型
char (字符型)
int (整型)
short (短整型)
long (长整型)
signed (有符号整型)
unsigned (无符号整型)
enum (枚举)
浮点型
float (单精度浮点数)
double (双精度浮点数)
long double (长双精度浮点数)
导出类型指针数组结构( struct结构名 )
联合( union联合名 )
类型区分符其他类型区分符:
void 表示没有值的类型(亦称为 空类型 )
用途,( 1)表示函数没有返回值;
void f(int x) {….}
( 2)说明函数参数的类型,表示函数没有参数;
int g(void) {……..}
( 3)说明指针所指对象的类型。
void *p;
const 将一个指对象说明为常量
2.1,2 数据类型的名字及长度完整的类型名 简写的类型名 长度 (字节 ) 值的范围
char char 1 有符号:- 128~ 127
无符号,0 ~ 255
signed char signed char 1 - 128~ 127
unsigned char unsigned char 1 0 ~ 255
int int 2或 4(与具体机器有关 )
2字节,- 32768 ~ 32767
4字节,约- 21亿~ 21亿signed int
unsigned unsigned 2或 4(与具体机器有关 )
2字节,0 ~ 65535
4字节,约 0~ 42亿unsigned int
short int
short 2 - 32768 ~ 32767short int
signed short
signed short int
2.1,2 数据类型的名字及长度(续)
完整的类型名 简写的类型名 长度 (字节 ) 值的范围
long
long 4 约- 21亿~ 21亿
long int
signed long
signed long int
unsigned short unsigned short 2 0~ 65535
unsigned short int
unsigned long unsigned long 4
4
约 0~ 42亿
unsigned long int
float float 4 约 |3.4e - 38| ~ |3.4e + 38|
( 7位有效数字)
double double 8 约 |1.7e - 308| ~ |1.7e +308|
( 15位有效数字)
long double long double ≥8 由具体实现定义说明:
( 1) 8种基本类型关键字名
char int short long signed unsigned float double
可直接用于说明数据对象,
short long signed unsigned 中的 1个或 2个可以用于修饰 char,int,double。
类型关键字组合规则:
signed 与 unsigned 不能同时修饰 char; short; long; int:
例,signed unsigned int a; 产生二义型
short 和 long不能同时修饰 int;
float不能使用任何修饰词 ;
double可用 long修饰,
( 2) int的长度与具体机器的字长相同,short与 long不变:
short的长度 ≤int的长度 ≤ long的长度
2.2 常量和变量文字常量(简称为常量或常数)
常量形式 10 1.23?a?,china”
符号常量 #define PI 3.14
2.2 常量的表示整数常量浮点常量
C 常量 字符常量字符串常量枚举常量
1,整数十进制整数:逢 10进 1,数字 0 ~ 9组成的符号串,
前面可有 +和-
123 +10 - 80
形式 八进制整数:逢 8进 1,数字 0 ~ 7组成的符号串,第一数字必须 为 0,八进制一般用于表示无符号整数正确形式,0137 0777 +010 - 024
错误形式,087
十六进制整数,逢 16进 1,数字 0 ~ 9和字母 a ~ f( A ~
F)组成的符号串,第一数字必须 为 0x或 0X,十六进制一般用于表示无符号整数正确形式,0x12 0xab 0xb 0xc 0xd 0xe 0xf
错误形式,0abc 0xbgh a123
八进制整数到十进制整数的转换:(乘法)
0137=1*82+3*81+7*80=95
十进制整数到八进制整数的转换,(整数除法)
例,95到八进制整数的转换
8 95
8 11 余 7
8 1 余 3
0 余 1
将余数反串连起得结果,0137
十六进制整数到十进制整数的转换:(乘法)
0X13a=1*162+3*61+10*160=314
十进制整数到十六进制整数的转换,(整数除法)
例,314到八进制整数的转换
16 314
16 19 余 10(写成 a)
16 1 余 3
0 余 1
将余数反串连起得结果,0X13a
十六进制整数到八进制整数的转换:
0X 1 3 a = 0 0 0 1 0 0 1 1 1 0 1 0
= 0 0 0 1 0 0 1 1 1 0 1 0
=0 4 7 2 (不必写成 0 04 7 2)
八进制整数到十六进制整数的转换:
0 2 7 5 5 3=0 1 0 1 1 1 1 0 1 1 0 1 0 1 1
=0 1 0 1 1 1 1 0 1 1 0 1 0 1 1
=0X 2 f 6 b
整型常数的类型:
( 1 ) 缺省类型,int
( 2 ) 不同后缀表示不同常数的类型:
长整型:在任意进制的整数后加 l 和 L,例:
27l 0400L 0xb8000000L
无符号整型:在任意进制的整数后加 u 和 U,例:
27u 0400u 0xb800u
无符号长整型:在任意进制的整数后加 ul 和 UL,例:
27UL 0400ul 0xb8000000UL
注意:各常数不要超过其值域范围。否则产生 溢出 。
2,浮点数用来表示实型数,一般形式为:
[± ] [整数部分 ] [,] [小数部分 ] [e ± n ]
使用时可有两种形式:
( 1)十进制数形式,例:
123.45 123.,23
( 2)指数形式,例:
123.5E+3 123.5E3 123.5E –3,1e2
阶码 1~ 3位
一个浮点数可以无整数部分或小数部分,但不可二者均无。
一个浮点数可以无小数点或指数部分,但不可二者均无。
浮点数常数的类型:
( 1 ) 缺省类型,double
( 2 ) 不同后缀表示不同常数的类型:
单精度型浮点数:在浮点数后加 f 或 F,例:
3.14159f 2.3F
单精度型浮点数:在浮点数后加 l 或 L,例:
1.7e+309L
注意浮点溢出:
-1.7e+308 -1.7e-308 0 1.7e-308 1.7e308
上溢区 下溢区 上溢区
3,字符字符常数指用单引号括起来的一个字符,形式为:
‘字符’
字符常数一个整数,
图形符号:单引号括起来的可打印字符
‘ ’ ‘ aAB~?
字符常数转义序列,由反斜线 (\)开头的一个特殊字符串
‘ \0\a\n\\\\”?
\ooo?,?\141? 表示‘ \a\012? 表示 ‘ \n?
\xhh\x61\ 表示‘ \a\xa? 表示 ‘ \n?
4,字符串字符串表示字符的有限序列
C语言无字符串类型,单可有字符串常数,用一对双引号括起字符的有限序列表示字符串常数,形式为:
“字符序列”
例:,This is a string\n” 长度为 17
“a\”b\\c” 长度为 5
“” 空串、长度为 0
系统在字符的存储时在末尾添加空字符
T h i s i s a s t r i n g?\n\0?
a,b \ c?\0?
‘\0’
注意:
( 1),a“与‘ a?表示不同概念。
( 2) 字符串中包含双引号字符时,必须使用转义序列。
字符串中包含单引号字符时,可使用转义序列,
也可不使用转义序列。
,It?s a pen” 等价于,It\?s a pen”
( 3)字符串可以连接。
,Hello,”,how are you” 等价于,Hello,how are you”
( 4)字符串常数必须写成一行。
printf(“Hello,how are you”); 不能写成
printf(“Hello,
how are you”);
2.2.2 符号常量用 #define定义符号常量(编译前处理)
#define SIZE 100
#define PI 3.141593
#define BLANK
符号常量 #define TWO_PI 2.0*PI
用 const定义符号常量(编译时处理)
const int max=100;
const double PI=3.141593;
const char BLANK=;
用枚举定义符号常量例:已知圆的半径,求周长和面积。
#include,stdio.h”
void main(void)
{
float r,s,area;
printf(“input r?”);
scanf(“%f”,&r);
s=2*3.14*r;
area=3.14*r*r;
printf(“s=%f area=%f”,s,area);
}
#include,stdio.h”
#define PI 3.14
void main(void)
{
float r,s,area;
printf(“input r?”);
scanf(“%f”,&r);
s=2*PI*r;
area=PI*r*r;
printf(“s=%f area=%f”,s,area);
}
#include,stdio.h”
const double PI=3.14;
void main(void)
{
float r,s,area;
printf(“input r?”);
scanf(“%f”,&r);
s=2*PI*r;
area=PI*r*r;
printf(“s=%f area=%f”,s,area);
}
2.2.3 变量说明形式,类型区分符号 变量表;
例,int age,index;
float f,g,h;
变量的特征:
( 1)变量名;
( 2)变量的类型;
( 3)变量的存储分配;
( 4)变量当前值。
变量的初始化:
在函数中定义的变量的值是不确定的,可在定义时初始化:
int age=10,index=20;
int i,j=10;
非法初始化:
int i=j=0;
必须用:
int i=0,j=0;
2.3 运算符和表达式
2.3.1 基本概念运算符 是六类单词之一,执行对操作数的各种操作。
按操作数的数目分类:
( 1) 单目 ( 2) 双目 ( 3) 三目按运算功能分类:
( 1) 算术运算符 ( 2) 关系运算符
( 3) 逻辑运算符 ( 4) 自增自减运算符
( 5) 按位运算符 ( 6) 赋值运算符
( 7) 条件运算符 ( 8) 下标运算符
( 9) 函数调用运算符 ( 10) 顺序求值运算符
( 11)类型强制符一般算术运算符表达式,由运算符和操作数组成的符合 C的语法规范的算式。
操作数包括:
( 1) 常量
( 2) 变量
( 3) 有返回值的函数 a – max(a,b)
( 4) ()括起的子表达式 (a+b)*c
表达式的结果,按运算规则计算出的表达式的值。
表达式的类型,表达式的值的类型。
优先级 运 算 符 结合性
1 ( ) [ ] ->
2 ! ~ ++ -- * & (类型名 ) sizeof 从右至左
3 * / %
4 + -
5 << >>
6 < <= > >=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13?,从右至左
14 = += -= *= /= %= &= |= ^= <<= >>= 从右至左
15,
运算符的优先级和结合性算术运算符运算符 + (单、双目加) - (单、双目减) *(乘)
/ (实数除、整数除) %(求余数或取模)
功能,与数学上对应运算符相同。
操作数类型,%的两操作数类型必须是整型,
+,-,*,/ 可对任何基本类型,双目运算符的两操作数类型可不同,运算前转换为相同,规则为:
( 1)对双目运算符的两操作数,值域窄的向值域的转换;
例 1,float x;
x+1 结果类型为 float (int?float)
(2) 当操作数类型为 char,signed char,unsigned char 或
short,signed short,unsigned short 时向 int或 unsigned
转换(与机器字长有关),称为,整数提升”
当 int能表示原来数据的值时,则被转换成 int,否则转换成
unsigned
例 2,‘ b’-’a’ 结果类型为 int (char?int)
例 3,unsigned short x;
int y;
表达式,x+y
对 32位机结果类型为 int,
对 16位机结果类型为 unsigned
例 4,unsigned x; long y;
表达式,x+y
对 32位机结果类型为 unsigned long,
对 16位机结果类型为 long
(3) 对整型数,长度相同时,有符号向无符号转换。
例 5,unsigned x; int y;
表达式,x+y
结果类型为 unsigned
除运算符( / )的两种功能:
( 1) 当两操作数都为整型数时,执行整数除,小数部分无条件去掉,结果类型为整型。
( 2) 当两操作数类型或其中之一的类型为浮点型,执行实数除,结果类型为浮点型。
例 1,3 / 6 (整数除,结果为 0,类型 int)
- 8 / 5 (整数除,结果为 -1,类型 int )
3,/ 6 (实数除,结果为 0,类型 int)
例 2,1+1/2+1/4+1/8 结果?
例 3:已知华氏温度为 F,下列哪些表达式能求摄氏温度 C。
( A) C=5/9*( F-32) ( B) C=5*( F-32) /9
( C) C=(F-32)*5/9 ( D) C=5.0/9*( F-32)
求余数运算符( %)的用途,
要求,两操作数类型必须是整型,
例 1,15%5 (结果为 0,类型 int)
13%5 (结果为 3,类型 int)
一般形式
a%b=a – a/b*b 余数符号与 a相同。
例 2,-13 % 5
结果 =- 13- ( - 13) /5*5=- 13+13/5*5= - 13+2*5= - 3
例 2,13 % (- 5)
结果 =13 - 13/( - 5) *( - 5) =13- 13/5*5=13- 2*5=2
2.3.3 关系运算运算符,< <= > >= == !=
优先级,见表,低于算术运算符,高于逻辑运算符。
运算符功能,比较两操作数的大小。
操作数类型,任何基本类型。
运算结果,非 0值表示为真(一般为整数 1),0值表示为假;
结果类型为 int。
例 1,int i=0,j=1,k=1;
i==j ( 0)
i!=j ( 1)
i+j==k (i+j)==k (1)
2.3.4 逻辑运算运算符,&& (与) || (或) ! (非)
优先级,见表,低于算术运算符和关系运算符。
操作数类型,任何基本类型。非 0值表示为真,0值表示为假;
运算结果,非 0值表示为真(一般为整数 1),0值表示为假;
结果类型为 int。
例 1:测试 c值为小写字母:
(c<=‘z’) && (c>=‘a’) c<=‘z’ && c>=‘a’
例 2:测试 c值不为小写字母:
(c>‘z’) || (c<‘a’) c > ‘z’ && c < ‘a’
或 ! ((c<=‘z’) && (c>=‘a’))
例 3:判断 i是否等于零。
i = = 0 (用关系表达式)
或 ! i (用逻辑表达式)
在程序中 ! i 的效率比 i = = 0 高例 4:表示数学条件 a<b<c的表达式。
习惯性错误形式,a<b<c 语法正确,语义错误。
例,2<1<3 数学意义上错误,但 C表达式结果:
2<1<3?( 2<1) <3? 0 < 3? 1 表示真。
2.3.5 自增和自减运算运算符,++(自增 ) -- (自减 )
优先级,见表,高于算术运算符。
表达式的形式,++n n++ -- n n--
运算符功能,将操作数自身增 1或减 1。
操作数类型,任何基本类型、指针类型的变量,具有存储单元的 左值表达式 。
运算结果类型,与操作数的类型相同。
例,int x=1,y=1;
++x 表达式的值为 2,变量 x的值也为 2。
--y 表达式的值为 0,变量 y的值为 0。
前缀式的计算:
标准 C,前缀式的自增、自减在表达式计算前,首先完成增 1、减 1的操作。
例,int x=1;
表达式 ++x + ++x + ++x 的值为 12
后缀式的计算延迟与序列点:
标准 C,后缀式的自增、自减运算有 计算延时,计算延时的终止点成为 序列点 。
非标准 C不一定遵循上述规则。
标准 C的 序列点,
( 1) 逻辑与运算符 (&&) ( 2) 逻辑或运算符 ( || )
( 3) 条件运算符 (?,) ( 4) 顺序求值运算符 (,)
( 5) 整个表达式例 1,int x=0,y=1;
表达式 x++ +x++ 的 表达式值 为 0,副作用,x的值为 2
表达式 y-x++ && x 的 表达式值 为 1,副作用,x的值为 1。
表达式 x*y-- || x 的 表达式值 为 0,副作用,y的值为 0。
例 2,int m=2,n=2;
表达式 ++m>=4 && ++n>=3
的 表达式值 为 0,副作用,m的值为 3,n不变。
表达式 ++m>=3 && ++n>=3
的 表达式值 为 1,副作用,m的值为 3,n的值为 3 。
表达式 ++m>=3 || ++n>=3
的 表达式值 为 1,副作用,m的值为 3,n不变。
表达式 ++m<=0 || ++n<3
的 表达式值 为 0,副作用,m的值为 3,n的值为 3 。
2002 年第二章 基本数据类型和运算
2.1 基本数据类型
数据是程序处理的对象,包括常量、变量、有返回值的函数。
不同性质的数据需要不同大小的存储空间,导致数据类型的划分,对某一编译程序而言,给各种数据类型分配固定大小存储空间,使其表示的数据值在一定的范围内,
称为数据类型的值域。
例,对短整型数,分配 2个字节,值域为 -32768~ 32767
数据类型是一组值和一组运算的集合。
2.1,1 C的数据类型类别 数据类型基本类型整型
char (字符型)
int (整型)
short (短整型)
long (长整型)
signed (有符号整型)
unsigned (无符号整型)
enum (枚举)
浮点型
float (单精度浮点数)
double (双精度浮点数)
long double (长双精度浮点数)
导出类型指针数组结构( struct结构名 )
联合( union联合名 )
类型区分符其他类型区分符:
void 表示没有值的类型(亦称为 空类型 )
用途,( 1)表示函数没有返回值;
void f(int x) {….}
( 2)说明函数参数的类型,表示函数没有参数;
int g(void) {……..}
( 3)说明指针所指对象的类型。
void *p;
const 将一个指对象说明为常量
2.1,2 数据类型的名字及长度完整的类型名 简写的类型名 长度 (字节 ) 值的范围
char char 1 有符号:- 128~ 127
无符号,0 ~ 255
signed char signed char 1 - 128~ 127
unsigned char unsigned char 1 0 ~ 255
int int 2或 4(与具体机器有关 )
2字节,- 32768 ~ 32767
4字节,约- 21亿~ 21亿signed int
unsigned unsigned 2或 4(与具体机器有关 )
2字节,0 ~ 65535
4字节,约 0~ 42亿unsigned int
short int
short 2 - 32768 ~ 32767short int
signed short
signed short int
2.1,2 数据类型的名字及长度(续)
完整的类型名 简写的类型名 长度 (字节 ) 值的范围
long
long 4 约- 21亿~ 21亿
long int
signed long
signed long int
unsigned short unsigned short 2 0~ 65535
unsigned short int
unsigned long unsigned long 4
4
约 0~ 42亿
unsigned long int
float float 4 约 |3.4e - 38| ~ |3.4e + 38|
( 7位有效数字)
double double 8 约 |1.7e - 308| ~ |1.7e +308|
( 15位有效数字)
long double long double ≥8 由具体实现定义说明:
( 1) 8种基本类型关键字名
char int short long signed unsigned float double
可直接用于说明数据对象,
short long signed unsigned 中的 1个或 2个可以用于修饰 char,int,double。
类型关键字组合规则:
signed 与 unsigned 不能同时修饰 char; short; long; int:
例,signed unsigned int a; 产生二义型
short 和 long不能同时修饰 int;
float不能使用任何修饰词 ;
double可用 long修饰,
( 2) int的长度与具体机器的字长相同,short与 long不变:
short的长度 ≤int的长度 ≤ long的长度
2.2 常量和变量文字常量(简称为常量或常数)
常量形式 10 1.23?a?,china”
符号常量 #define PI 3.14
2.2 常量的表示整数常量浮点常量
C 常量 字符常量字符串常量枚举常量
1,整数十进制整数:逢 10进 1,数字 0 ~ 9组成的符号串,
前面可有 +和-
123 +10 - 80
形式 八进制整数:逢 8进 1,数字 0 ~ 7组成的符号串,第一数字必须 为 0,八进制一般用于表示无符号整数正确形式,0137 0777 +010 - 024
错误形式,087
十六进制整数,逢 16进 1,数字 0 ~ 9和字母 a ~ f( A ~
F)组成的符号串,第一数字必须 为 0x或 0X,十六进制一般用于表示无符号整数正确形式,0x12 0xab 0xb 0xc 0xd 0xe 0xf
错误形式,0abc 0xbgh a123
八进制整数到十进制整数的转换:(乘法)
0137=1*82+3*81+7*80=95
十进制整数到八进制整数的转换,(整数除法)
例,95到八进制整数的转换
8 95
8 11 余 7
8 1 余 3
0 余 1
将余数反串连起得结果,0137
十六进制整数到十进制整数的转换:(乘法)
0X13a=1*162+3*61+10*160=314
十进制整数到十六进制整数的转换,(整数除法)
例,314到八进制整数的转换
16 314
16 19 余 10(写成 a)
16 1 余 3
0 余 1
将余数反串连起得结果,0X13a
十六进制整数到八进制整数的转换:
0X 1 3 a = 0 0 0 1 0 0 1 1 1 0 1 0
= 0 0 0 1 0 0 1 1 1 0 1 0
=0 4 7 2 (不必写成 0 04 7 2)
八进制整数到十六进制整数的转换:
0 2 7 5 5 3=0 1 0 1 1 1 1 0 1 1 0 1 0 1 1
=0 1 0 1 1 1 1 0 1 1 0 1 0 1 1
=0X 2 f 6 b
整型常数的类型:
( 1 ) 缺省类型,int
( 2 ) 不同后缀表示不同常数的类型:
长整型:在任意进制的整数后加 l 和 L,例:
27l 0400L 0xb8000000L
无符号整型:在任意进制的整数后加 u 和 U,例:
27u 0400u 0xb800u
无符号长整型:在任意进制的整数后加 ul 和 UL,例:
27UL 0400ul 0xb8000000UL
注意:各常数不要超过其值域范围。否则产生 溢出 。
2,浮点数用来表示实型数,一般形式为:
[± ] [整数部分 ] [,] [小数部分 ] [e ± n ]
使用时可有两种形式:
( 1)十进制数形式,例:
123.45 123.,23
( 2)指数形式,例:
123.5E+3 123.5E3 123.5E –3,1e2
阶码 1~ 3位
一个浮点数可以无整数部分或小数部分,但不可二者均无。
一个浮点数可以无小数点或指数部分,但不可二者均无。
浮点数常数的类型:
( 1 ) 缺省类型,double
( 2 ) 不同后缀表示不同常数的类型:
单精度型浮点数:在浮点数后加 f 或 F,例:
3.14159f 2.3F
单精度型浮点数:在浮点数后加 l 或 L,例:
1.7e+309L
注意浮点溢出:
-1.7e+308 -1.7e-308 0 1.7e-308 1.7e308
上溢区 下溢区 上溢区
3,字符字符常数指用单引号括起来的一个字符,形式为:
‘字符’
字符常数一个整数,
图形符号:单引号括起来的可打印字符
‘ ’ ‘ aAB~?
字符常数转义序列,由反斜线 (\)开头的一个特殊字符串
‘ \0\a\n\\\\”?
\ooo?,?\141? 表示‘ \a\012? 表示 ‘ \n?
\xhh\x61\ 表示‘ \a\xa? 表示 ‘ \n?
4,字符串字符串表示字符的有限序列
C语言无字符串类型,单可有字符串常数,用一对双引号括起字符的有限序列表示字符串常数,形式为:
“字符序列”
例:,This is a string\n” 长度为 17
“a\”b\\c” 长度为 5
“” 空串、长度为 0
系统在字符的存储时在末尾添加空字符
T h i s i s a s t r i n g?\n\0?
a,b \ c?\0?
‘\0’
注意:
( 1),a“与‘ a?表示不同概念。
( 2) 字符串中包含双引号字符时,必须使用转义序列。
字符串中包含单引号字符时,可使用转义序列,
也可不使用转义序列。
,It?s a pen” 等价于,It\?s a pen”
( 3)字符串可以连接。
,Hello,”,how are you” 等价于,Hello,how are you”
( 4)字符串常数必须写成一行。
printf(“Hello,how are you”); 不能写成
printf(“Hello,
how are you”);
2.2.2 符号常量用 #define定义符号常量(编译前处理)
#define SIZE 100
#define PI 3.141593
#define BLANK
符号常量 #define TWO_PI 2.0*PI
用 const定义符号常量(编译时处理)
const int max=100;
const double PI=3.141593;
const char BLANK=;
用枚举定义符号常量例:已知圆的半径,求周长和面积。
#include,stdio.h”
void main(void)
{
float r,s,area;
printf(“input r?”);
scanf(“%f”,&r);
s=2*3.14*r;
area=3.14*r*r;
printf(“s=%f area=%f”,s,area);
}
#include,stdio.h”
#define PI 3.14
void main(void)
{
float r,s,area;
printf(“input r?”);
scanf(“%f”,&r);
s=2*PI*r;
area=PI*r*r;
printf(“s=%f area=%f”,s,area);
}
#include,stdio.h”
const double PI=3.14;
void main(void)
{
float r,s,area;
printf(“input r?”);
scanf(“%f”,&r);
s=2*PI*r;
area=PI*r*r;
printf(“s=%f area=%f”,s,area);
}
2.2.3 变量说明形式,类型区分符号 变量表;
例,int age,index;
float f,g,h;
变量的特征:
( 1)变量名;
( 2)变量的类型;
( 3)变量的存储分配;
( 4)变量当前值。
变量的初始化:
在函数中定义的变量的值是不确定的,可在定义时初始化:
int age=10,index=20;
int i,j=10;
非法初始化:
int i=j=0;
必须用:
int i=0,j=0;
2.3 运算符和表达式
2.3.1 基本概念运算符 是六类单词之一,执行对操作数的各种操作。
按操作数的数目分类:
( 1) 单目 ( 2) 双目 ( 3) 三目按运算功能分类:
( 1) 算术运算符 ( 2) 关系运算符
( 3) 逻辑运算符 ( 4) 自增自减运算符
( 5) 按位运算符 ( 6) 赋值运算符
( 7) 条件运算符 ( 8) 下标运算符
( 9) 函数调用运算符 ( 10) 顺序求值运算符
( 11)类型强制符一般算术运算符表达式,由运算符和操作数组成的符合 C的语法规范的算式。
操作数包括:
( 1) 常量
( 2) 变量
( 3) 有返回值的函数 a – max(a,b)
( 4) ()括起的子表达式 (a+b)*c
表达式的结果,按运算规则计算出的表达式的值。
表达式的类型,表达式的值的类型。
优先级 运 算 符 结合性
1 ( ) [ ] ->
2 ! ~ ++ -- * & (类型名 ) sizeof 从右至左
3 * / %
4 + -
5 << >>
6 < <= > >=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13?,从右至左
14 = += -= *= /= %= &= |= ^= <<= >>= 从右至左
15,
运算符的优先级和结合性算术运算符运算符 + (单、双目加) - (单、双目减) *(乘)
/ (实数除、整数除) %(求余数或取模)
功能,与数学上对应运算符相同。
操作数类型,%的两操作数类型必须是整型,
+,-,*,/ 可对任何基本类型,双目运算符的两操作数类型可不同,运算前转换为相同,规则为:
( 1)对双目运算符的两操作数,值域窄的向值域的转换;
例 1,float x;
x+1 结果类型为 float (int?float)
(2) 当操作数类型为 char,signed char,unsigned char 或
short,signed short,unsigned short 时向 int或 unsigned
转换(与机器字长有关),称为,整数提升”
当 int能表示原来数据的值时,则被转换成 int,否则转换成
unsigned
例 2,‘ b’-’a’ 结果类型为 int (char?int)
例 3,unsigned short x;
int y;
表达式,x+y
对 32位机结果类型为 int,
对 16位机结果类型为 unsigned
例 4,unsigned x; long y;
表达式,x+y
对 32位机结果类型为 unsigned long,
对 16位机结果类型为 long
(3) 对整型数,长度相同时,有符号向无符号转换。
例 5,unsigned x; int y;
表达式,x+y
结果类型为 unsigned
除运算符( / )的两种功能:
( 1) 当两操作数都为整型数时,执行整数除,小数部分无条件去掉,结果类型为整型。
( 2) 当两操作数类型或其中之一的类型为浮点型,执行实数除,结果类型为浮点型。
例 1,3 / 6 (整数除,结果为 0,类型 int)
- 8 / 5 (整数除,结果为 -1,类型 int )
3,/ 6 (实数除,结果为 0,类型 int)
例 2,1+1/2+1/4+1/8 结果?
例 3:已知华氏温度为 F,下列哪些表达式能求摄氏温度 C。
( A) C=5/9*( F-32) ( B) C=5*( F-32) /9
( C) C=(F-32)*5/9 ( D) C=5.0/9*( F-32)
求余数运算符( %)的用途,
要求,两操作数类型必须是整型,
例 1,15%5 (结果为 0,类型 int)
13%5 (结果为 3,类型 int)
一般形式
a%b=a – a/b*b 余数符号与 a相同。
例 2,-13 % 5
结果 =- 13- ( - 13) /5*5=- 13+13/5*5= - 13+2*5= - 3
例 2,13 % (- 5)
结果 =13 - 13/( - 5) *( - 5) =13- 13/5*5=13- 2*5=2
2.3.3 关系运算运算符,< <= > >= == !=
优先级,见表,低于算术运算符,高于逻辑运算符。
运算符功能,比较两操作数的大小。
操作数类型,任何基本类型。
运算结果,非 0值表示为真(一般为整数 1),0值表示为假;
结果类型为 int。
例 1,int i=0,j=1,k=1;
i==j ( 0)
i!=j ( 1)
i+j==k (i+j)==k (1)
2.3.4 逻辑运算运算符,&& (与) || (或) ! (非)
优先级,见表,低于算术运算符和关系运算符。
操作数类型,任何基本类型。非 0值表示为真,0值表示为假;
运算结果,非 0值表示为真(一般为整数 1),0值表示为假;
结果类型为 int。
例 1:测试 c值为小写字母:
(c<=‘z’) && (c>=‘a’) c<=‘z’ && c>=‘a’
例 2:测试 c值不为小写字母:
(c>‘z’) || (c<‘a’) c > ‘z’ && c < ‘a’
或 ! ((c<=‘z’) && (c>=‘a’))
例 3:判断 i是否等于零。
i = = 0 (用关系表达式)
或 ! i (用逻辑表达式)
在程序中 ! i 的效率比 i = = 0 高例 4:表示数学条件 a<b<c的表达式。
习惯性错误形式,a<b<c 语法正确,语义错误。
例,2<1<3 数学意义上错误,但 C表达式结果:
2<1<3?( 2<1) <3? 0 < 3? 1 表示真。
2.3.5 自增和自减运算运算符,++(自增 ) -- (自减 )
优先级,见表,高于算术运算符。
表达式的形式,++n n++ -- n n--
运算符功能,将操作数自身增 1或减 1。
操作数类型,任何基本类型、指针类型的变量,具有存储单元的 左值表达式 。
运算结果类型,与操作数的类型相同。
例,int x=1,y=1;
++x 表达式的值为 2,变量 x的值也为 2。
--y 表达式的值为 0,变量 y的值为 0。
前缀式的计算:
标准 C,前缀式的自增、自减在表达式计算前,首先完成增 1、减 1的操作。
例,int x=1;
表达式 ++x + ++x + ++x 的值为 12
后缀式的计算延迟与序列点:
标准 C,后缀式的自增、自减运算有 计算延时,计算延时的终止点成为 序列点 。
非标准 C不一定遵循上述规则。
标准 C的 序列点,
( 1) 逻辑与运算符 (&&) ( 2) 逻辑或运算符 ( || )
( 3) 条件运算符 (?,) ( 4) 顺序求值运算符 (,)
( 5) 整个表达式例 1,int x=0,y=1;
表达式 x++ +x++ 的 表达式值 为 0,副作用,x的值为 2
表达式 y-x++ && x 的 表达式值 为 1,副作用,x的值为 1。
表达式 x*y-- || x 的 表达式值 为 0,副作用,y的值为 0。
例 2,int m=2,n=2;
表达式 ++m>=4 && ++n>=3
的 表达式值 为 0,副作用,m的值为 3,n不变。
表达式 ++m>=3 && ++n>=3
的 表达式值 为 1,副作用,m的值为 3,n的值为 3 。
表达式 ++m>=3 || ++n>=3
的 表达式值 为 1,副作用,m的值为 3,n不变。
表达式 ++m<=0 || ++n<3
的 表达式值 为 0,副作用,m的值为 3,n的值为 3 。