文章目录
3.4 C 语句
3.4.1 C 语句的作用和分类
- 一个函数包含声明部分和执行语句,执行部分由语句组成。
- 语句的作用是向计算机系统发出操作指令,要求执行相应的操作。
- 一个 C 语句经过编译后产生若干条机器指令。
- 声明部分不是语句,不产生机器指令,知识对数据的声明。
- C程序结构如下图所示:
- C 语句分为以下5类:
(1)控制语句
序号 | 形式 | 说明 |
---|---|---|
① | if( )…else… | 条件语句 |
② | for( )… | 循环语句 |
③ | while( )… | 循环语句 |
④ | do…while( )… | 循环语句 |
⑤ | continue | 结束本次循环语句 |
⑥ | break | 终止执行switch或循环语句 |
⑦ | switch | 多分支选择语句 |
⑧ | return | 函数返回语句 |
⑨ | goto | 转向语句,在结构化程序中基本不用goto语句 |
(2)函数调用语句
函数调用语句:由一个函数调用加一个分号构成。
例如:
printf("This is a C statement.");
(3)表达式语句
表达式语句:由一个表达式加一个分号构成。
例如:
a=3; //赋值表达式构成的赋值语句
i=i+1 //是表达式,不是语句
i=i+1; //是语句
x+y; //是合法语句,但无被复制给一个变量,因此无意义
(4)空语句
例如下面是一个空语句
;
(5)复合语句
复合语句:用{ }把一些语句和声明括起来成为复合语句,又成语句块。
{
float pi=3.14159,r=2.5,area;//定义变量
area = pi * r * r;
printf("area=%f",area);
}
3.4.2 最基本的语句 —— 赋值语句
先通过一个例子熟悉一下赋值语句。
【例 3.4】给出三角形的三边长,求三角形的面积。
解此题的关键就是找到合适的计算公式,然后编程实现。
a
r
e
a
=
s
(
s
−
a
)
(
s
−
b
)
(
s
−
c
)
area=\sqrt{s(s-a)(s-b)(s-c)}
area=s(s−a)(s−b)(s−c)
其中,
s
=
(
a
+
b
+
c
)
/
2
s=(a+b+c)/2
s=(a+b+c)/2。
#include <stdio.h>
#include <math.h> //用到数学库函数的话需要包含该头文件
int main(void)
{
double a,b,c,s,area; //为了提高计算精度,定义各变量为double型
a=3.67; //对边长a赋值
b=5.43; //对边长b赋值
c=6.21; //对边长c赋值
s=(a+b+c)/2; //计算s
area=sqrt(s*(s-a)*(s-b)*(s-c)); //计算area
printf("a=%f\tb=%f\tc=%f\n",a,b,c); //输出三边的值,\t为TAB键的转义字符
printf("area=%f\n",area);
return 0;
}
运行结果:
1. 赋值运算符
a=3;//‘=’就是赋值运算符,将数值3赋给变量a
2. 复合的赋值运算符
- 在赋值符=之前加上其他运算符,可以构成复合的运算符。
例如:a+=3; //等价于 a=a+3; x*=y+8; //等价于 x=x*(y+8); x%3; //等价于 x=x%3;
- 凡是二元运算符,都可以与赋值符一起组合成复合赋值运算符。
- C语言使用赋值运算符优点:一是为了简化程序,使程序精炼;二是为了提高编译效率,能产生质量较高的目标代码。
3. 赋值表达式
一般形式:
变量 赋值运算符 表达式
-
赋值表达式的作用:将一个表达式的值赋给一个变量,因此赋值表达式具有计算和赋值的双重功能。
-
赋值表达式左侧是可以修改的左值。
-
能出现在赋值运算符右侧的表达式称为右值。
-
凡是左值都可以作为右值。
//赋值运算符按照“自右至左”的结合顺序
a=b=c=5; //c=5,b=5,a=5
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=(b=3*4); //b=12,a=12
printf("%d",a=b); //该语句完成赋值和输出双重功能,先将b的值赋给a,然后将a的值输出
4. 赋值过程中的类型转换
-
如果赋值运算符两侧的类型一致,则直接进行赋值。
-
如果赋值运算符两侧的类型不一致,但都是基本类型时(参考基本类型总结),在赋值时要进行类型转换。类型转换是由系统自动进行的,转换的规则是:
-
(1)将浮点型数据赋给整型变量时,先对浮点数据取整,舍弃小数部分,然后赋给整型变量。
int i; i=3.56; //i=3
-
(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点型存储到变量中。
float f; double d; f=23; //将23.0存入f中 d=23; //将23.0存入d中
-
(3)将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到float型变量的4个字节中。
应注意双精度数值的大小,是否超过float型变量的范围,否则输出的值错误。如果将float型变量赋值给double型变量时,值不变,在内存中以8字节存储,有效位扩展到15位。
float f; double d=123.45678e100;//指数为100超过了float数据的最大范围 f=d;//f无法容纳如此大的数据,就出现错误
-
(4)将字符型数据赋给整型变量时,将字符型的ASCII代码赋给整型变量。
int i; i='A'; //i=65
-
(5)将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,只将低字节原封不动地送到被赋值的变量(即发生“截断”)。
int i=289; //二进制 00000001 00100001 char c='a'; c=i; //c=33,二进制 00100001
int a=32767;//二进制 00000000 00000000 01111111 11111111 short b; b=a+1; //b=-32768 二进制 10000000 00000000
5. 赋值表达式和赋值语句
-
赋值表达式的末尾没有分号;
-
赋值语句的末尾有分号。
-
if((a=b)>0) max=a; 该写法正确,意思是先将b的值赋给a,再判断a是否大于0。
-
if((a=b;)>0) max=a; 该写法错误。
6. 变量赋初值
- 可以在变量定义时对变量赋初值,这样更简练。
int a=3; //定义变量a为整型变量,并赋初值3
float f=3.56; //定义变量f为单精度浮点型变量,并赋初值3.56
char c='a'; //定义变量c为字符型变量,并赋初值为字符'a'
int a,b,c=5; //可以对部分变量赋初值
//a,b,c赋同样的值
int a=3,b=3,c=3; //正确
int a=b=c=3; //错误
本节完