? 第一章 C语言概述
? 第二章 数据类型、运算符与表达式
? 第三章 最简单的 C程序设计
? 第四章 逻辑运算和判断选取控制
? 第五章 循环控制
? 第六章 数组
? 第八章 编译预处理
? 第九章 指针
? 第十章 结构体与共用体
? 第十二章 文件的基本操作
? 第十三章 位运算
§ 2.6 变量赋初值
C语言允许定义变量时赋予初值。
如,
int i = 6;
float x=8.35;
char c ='6';
? 不可以将具有相同初值的变量赋初值时写成,
int a=b=c=6;
可以这样写,
int a=6,b=6,c=6;
? 定义变量时赋初值实际上是在运行时执行一
个赋初值语句,
int a=6;
相当于, int a;
a=6;
注意,? 也可以只对某个变量赋初值,
int a,b,c = 6;
§ 2.7 算术运算符与算术表达式
运算符, 运算的符号表示。
C语言有丰富的运算功能,先简述之
2.7.1.C运算符 (共有 13类 )
1,算术运算符 +,–,?,/,%,等
3,逻辑运算符 !,&&,|
2,关系运算符 >,<,= =,> =,<=,!=
4,位运算符 <<,>>,~,|,^,&,
5,赋值运算符 = 等
6,条件运算符? 等
7,逗号运算符,
8,指针运算符 *,&
11,分量运算符 ?,?,
12,下标运算符 [ ]
13,其它运算符 如函数的调用 ( )
9,求字节数运算符 size of
10,强制类型转换运算符 (类型 )
2.7.2 算术运算符和算术表达式
一、基本算术运算符
+ 加法,正值。 如,3+6,+3
– 减法, 负值。 如,6– 4,–5
? 乘法。 如,3?8
/ 除法。 如,8 / 5
% 求余。 如,7 % 4 的值为 3
注, ? 两个整型数据相除 (结果取整 )。
–5/ 3 ? – 1
使用时千万注意 int / int 可能会 出现数据丢失。
?,/” 中,有一个 float,则结果为 double型。
二、算术表达式及算术运算符的优先级与结合性
运算对象, 常量, 变量, 函数 等
优先级, ( ),?,/,%,+,–
算术表达式, 用算术运算符和括号将运算对象
连接起来,且符合 C语法规则的式子 。
运算结合方向,1,自左向右,为左结合性。
2,自右向左,为右结合性 。
例, a ? b / c – 1.5 + 'a'–d ?e;
提示,关于运算符的优先级和结合方向详见附录三。
a=b=c=d;
相当于, a=(b=(c=d));
若在运算量的两侧的运算符有相同的优先
级, 则按它们的结合方向顺序处理 。
三、可利用强制类型转换运算符将一个算术表达
式转换为所需类型
形式, (类型名 ) (表达式 )
例如, (double) a 将 a转换为 double
(int) (x+y) 将 x+y转换为 int
(float) (5%3) 将 5%3转换为 float
注, ? 括号不能省略。
否则, intx 会理解为变量 intx,
又如, (int) (x+y) 若省略, (int)x+y会变成只
将 x转成整型,
2,转换后的类型数据由系统分配一个中间变量
存放,而原变量类型不变。
若有,float x;
则, (int)x;
x本身仍为实型,而 (int)x由一个中间变量 (整 )
存放 x的整数部分。
例, /*exp7.c*/
#include<stdio.h>
main( )
{ float x,y;
int m,n;
x=3.6;
m=36;
n=x;
y=m;
printf("x=%f,y=%f,m=%d,n=%d\n",x,y,m,n);
}
运行结果, x=3.600000,y=36.000000,m=36,n=3
小结, 有二种方法进行数据类型转换,
1,强制
且, 强制类型转换运算优先于算术运算符,
2,系统自动
如, 若 x为 float,则 x%3不合法。
但可用 (int)x%3来解决。 (附录 III介绍了优先级 )
四、自增,自减运算符
例如,若有, int i = 3;
+ + 自增 1 – – 自减 1
++i,先使 i值 +1,再使用 i值 ;
i++,先使用 i值,再使 i值 +1,
则, j= ++i; 结果为, j=4,i=4,相当于 i=i+1; j=i;
则, j=i++; 结果为, j=3,i=4,相当于 j=i; i=i+1
同理, – –i,i – –,均使 i值 –1,但,
– – i,先使 i值 –1,再使用 i值 ;
i – –,先使用 i值,再使 i值 –1
例如,int i = 3,j;
则, j=– – i; 结果为, j=2,i=2,相当于 i=i–1; j=i;
则, j=i– –; 结果为, j=3,i=2,相当于 j=i; i=i–1;
1,++和 – –运算法只能用于变量,不得用于常量和表
达式,
如, 5+ +,(a+b)+ +均为不合法,
几 点注意,
2,++,– –,的结合性为从右至左,而一般算术运算符
为从左至右。 如,
–i++ ? "–"和 "+ +"为同一优先级,
–i++相当于 –(i++)
例, /*exp9.c*/
#include<stdio.h>
main( )
{ int i=3,j;
j=-i++;
printf("i=%d,j=%d\n",i,j);
}
运行结果,i=4,j= -3
1,要慎用 ++,– –运算符。
五、有关表达式使用中的问题说明
对于表达式 (i++)+(i++)+(i++) ;
我们可能会认为应 从左至右,3+4+5=12
例, /*exp8.c*/
#include<stdio.h>
main( )
{ int i=3,j;
j=(i++)+(i++)+(i++);
printf("i=%d,j=%d\n",i,j);
}
实际运行结果,i=6,j=9
先对 i进行 3次自加,结果 i的值为 6,然后三个 i
值相加为 18。
3+3+3=9 然后再把 6赋给 i值
如果表达式 j=(i++)+(i++)+(i++);改 为,
j=(++i)+(++i)+(++i);
则运行结果,i=6,j=18
这是因为运算时是先取 i的原值,3
2,在表达式中,有的运算符为一个字符,有的为两个字符。
一般地, 自左至右尽可能多地将若干字符组成一个
运算符 。
如, i+++j,究竟理解为 (i++)+j还是 i+(++j)?
例, #include<stdio.h>
main( )
{ int i=3,j=3,m;
m=i+++j;
printf("i=%d,j=%d,m=%d\n",i,j,m);
}
运行结果,i=4,j=3,m=6
对语句 m=i+++j; 系统理解为 m=(i++)+j;
请注意:不能有这样的语句,
m=i+++++j;
系统不理解成 m=(i++)+(++j)
因为 ++运算符的结合方向从右至左。
但可以写成 m=i+++(++j);
另外也不能写成,m=i+(++(++j));
3,在函数调用时要注意参数的计算顺序,如,
printf("i=%d,i=%d",i,i++);
int i=3;
int j=3;
printf("j++=%d,j=%d",j++,j);
输出结果, i=4,i=3;
j=3,j=3;
这是因为:参数的计算顺序从右到左。
§ 2.8 赋值运算符和
赋值表达式
符号 " = "为赋值运算符。
2,整型数据赋给实型变量,数值不变,但按实数形
式存放,
1,将实型数据 (无论单,双精度 )赋给整型变量时,舍
弃小数,
赋值时,两边类型若不一致,则按以下规则转换,
4,将 int?long int,进行符号扩展。
即, 符号扩展,低 16位 ?long 的低 16位。
5,long int ? int 则高 16位截断。
3,字符型数据赋给整型变量时,
(2)字符 ?带符号整型变量,则字符高位扩展。
(1)字符 ?无符号整型变量,则存入低 8位,高 8位补零。
6,将 unsigned int 型 ?long int高位补 0。
位数相同部分赋值
unsigned int ?int
unsigned long ?long
unsigned short ?short
原值传送,但数据大小不能超值。
如, unsigned int a=32768;
int b;
b=a;
则 b的值超出范围,系统赋予它一个另外的值。
a与 b的取值对应关系,
a,0 …… 32767 …… 65535
b,0 …… 32767 …… 65535 ?1 …… ?32768 ?32768 ?1 0 ……
7,非 unsigned 型 转换成长度相同的 unsigned型数据,
原样传送 (包括符号位 )
一、复合赋值运算符:在 " = "号之前加一个其它
运算符。
C语言规定,凡是二目运算符均可构成复合运算符。
例, a+=3; 相当于 a=a+3
x?=y+8; 相当于 x=x ?(y+8)
x%=3; 相当于 x=x%
一般形式,
<变量 > <赋值运算符 > <表达式 >
二、赋值表达式
例, x=10 为一赋值表达式
其中 <表达式 >又可以是一个赋值表达式。
例, x=(y=10) 相当于 y=10; x=y
由于赋值号为右结合性,于是 " ( ) "可省略,
即为, x=y=10;
例, a + = a – =a?a (设 a?12)
又, a=5+(c=6) ?c=6,a=11
a=(b=4)+(c=6) ?b=4,c=6,a=10
a=(b=10)/ (c=2)?b=10,c=2,a=5
进一步,还可用复合赋值运算符作下列运算,
步骤, a?a?144,
a – =a ?a ?a=a –a ?a=12 –144= –132
a + = –132 ? a = a+(–132) = –264
§ 2.9 逗号运算符和
逗号表达式
一般形式,
表达式 1,表达式 2
其计算规则,
先计算表达式 1,再计算表达式 2,最后值为表达式
2的值。
例,a=3?5,a ? 4
则, 先计算 3 ? 5,a?15,a ? 4=60,结果为 60。
又如, (a=3?5,a ? 4),a+5
扩展形式,
表达式 1,表达 2,…,表达式 n,
结果为 20(作为逗号表达式的值 )
? a+5?a 即 20?a,
? 3 ? 5=15?a
? a ? 4=60 (此时 a值仍未变 )
结果为表达式 n的值
注意,
? x=(a=3,6?3) 赋值表达式,x的值 18;
? x=a=3,6 ? a 逗号表达式,x的值 3,
逗号表达式主要用于某些语句中需一次计算
多个表达式值的情况。如在循环语句中。
函数调用中的实参之间虽然用的是逗号间隔,
但不是逗号表达式。
如, printf ("%d,%d,%d",a,b,c);
§ 2.10 类数值型数据间的
混合运算
C语言允许双精度、单精度、整型及字符数据之
间混合运算
10+'a'+1.5–8765.1234 ? 'b'
是允许的。
但有一个规则,先转换成同一类型,再计算。
double ? float


图中,?, 表示必定转换。如 'a' +' b',先转换
为 int。 结果为 int。
转换方法,
?
long
?
unsigned
?
int ? char,short
即, 既使是同一种类型也按 " ? "转换。
图中,?,, 表示低,高型数据运算时,均先转
换为高型。
例, 10+' a'+i?f –d /e
其中, i –– int
f –– float
d –– double
e –– long
? 10+'a',转为 int,结果为 int
? i?f,转为 double,结果为 double
? ?+?, 转为 double
? d /e, 转为 double
? ? - ? 转为 double
则运算时,
§ 3.1 C语句概述
C语句全部为可执行语句,对应若干机器操作指命令
C程序由许多源文件组成。 (分别编译,然后连接 )
每一个源文件由预编译命令和若干函数组成。
每一个函数由说明部分和语句部分组成。
C程序结构如 图,
除说明部分外,重要部分为语句部分。
C 程序
源程序文件 1 源程序文件 i 源程序文件 n
预编译命令 函数 1 函数 n
说 明 部 分 执行部分
(语句 )
… …
函数调用语句,
如,printf ("… ");
C 语句分为五类
1,表达式语句
赋值语句,
如,i=i+1; i++; x+y;
空语句,
任何事情都不做。
2,控制语句 ––改变语句的执行顺序
if ( ) ~ else ~ (条件 )
for ( ) ~ (循环 )
while ( ) ~ (循环 )
do ~ while (循环 )
switch (多分支选择 )
( )表示条件,~表示语句
continue (结束本次循环 )
break (中止整个循环 )
return ( 函数返回 )
3,限定转向 (无条件转向 )语句
5,终止程序运行语句
4.无条件转移语句
goto
exit
6,复合语句
用 { } 括起来的一系列语句。
如, { z=x+y;
t=z/100;
printf ("%f",t);
}
§ 3.2 程序的三种基本结构
从 结构化程序设计角度出发,程序有三种结构,
·顺序结构
·选择结构
·循环结构
1,顺序结构
表示
A
B
A
B
先执行 A,再执行 B,
2,选择结构
表示为
A B
P T F
B
T P F
A
存在某条件 P,若 P为真,则执行 A,否则执行 B。
3,循环结构
表示为 P
F
T
A A
P为 T
(1) 当型结构
当 P条件成立时 (T),反复执行 A,直到 P为,假”
时才停止循环,
有两种结构,当型 和 直到型
(2) 直到型
A
P F
T
A
直到 P为真
先执行 A,再判断 P,若为 F,再执行 A,如此反复,
直到 P为 T,
另外,由选择结构可以派生出另一种基本结构 ––
多分支结构,
K K=K1
A1 A2 Ai An … …
K=K2
K=Ki
已证明, 上述三种结构组成的程序可以解决全部
的问题,所以任何一种高级语言都具备上述三种结
构。