表达式和语句

时间:2023-02-10 21:15:58

前面其实我们已经不知不觉多次使用了表达式和语句,接下来,我们深入地了解一下它们。C的基本程序由语句组成,而大多数语句由语句构成。

1.表达式

表达式由运算符和运算对象组成。最简单的表达式就是一个单独的运算对象,运算对象可以是常量、变量或二者的组合。一些表达式由子表达式(子表达式即一个完整表达式的一部分)组成。下面是一些表达式:

6               //一个最简单的表达式
c //一个最简单的表达式
q = 3 * r
a + (b - c) / d //b-c就是一个子表达式

C语言中表达式的一个最重要的特性就是,每个表达式都有一个值。要获得这个值必须根据运算符优先级规定的顺序来执行操作,如​​q = 2 * 3​​作为一个整体的值就是6。

2.语句

语句是C程序的基本构建块,一条语句相当于完整的计算机指令。在C中,大部分语句都以分号结尾,因此

num = 4   //只是一个表达式
num = 4; //表达式语句,表达式语句即在一个表达式后面加上分号
8; //表达式语句
3 + 4; //表达式语句

最简单的语句是空语句​​;​​,但类似这些语句在程序中什么也没做,不算是有用的语句。更准确地说,语句可以改变值或调用函数。

虽然一条有用的语句相当于一条完整的指令,但不是所有的指令都是语句,参考下面例子:

int x, y;         //声明
x = 6 + (y = 6); //x = 12; (y=6)尽量不用

其中,y = 6是一条完整的指令,但是它只是语句的一部分。因为一条完整的指令不一定是一条语句,所以分号用于识别在这种情况下的语句,另外,声明并不是表达式语句,因为去掉分号之后,声明并没有值,不是一个表达式。

3.副作用和序列点

副作用是C语言中的一个术语,副作用是对数据对象或文件及进行修改。例如,语句​​state = 50;​​,从C的角度来说,它的主要目的是对表达式求值,即50,副作用就是将state的值改为50;再例如,一个printf()语句,它显示的信息是副作用,它的主要目的是返回打印字符的个数。

序列点是程序执行的点,在该点上,所有副作用都在进入下一步之前发生。在C中,语句中的分号标记了一个序列点,另外,任何一个完整表达式也是一个序列点。

4.复合语句(块)

复合语句是用花括号括起来的一条或多条语句,复合语句也成为块。

/* program1.c */
……
index = 0;
while(index++ < 10)
sam = 10 * index + 2;
printf("sam = %d\n", sam);
……

/* program2.c */
……
index = 0;
while(index++ < 10){
sam = 10 * index + 2;
printf("sam = %d\n", sam);
}
……

在第一个程序段中,while循环中只有一个表达式语句,而在第二个程序段中,用花括号将两个表达式语句括起来,变成while循环的一部分,它们就是复合语句,整个复合语句被视为一条语句。同时,while语句也是一种迭代语句,有时也被成为结构化语句。