C语言程序设计.7.运算符表达式和语句

一、表达式

表达式(expression) 由运算符和运算对象组成(前面介绍过, 运算对象是运算符操作的对象) 。 最简单的表达式是一个单独的运算对象, 以此为基础可以建立复杂的表达式。 下面是一些表达式:
4 -6 4+
21
a*(b + c/d)/20
q = 5*2
x = ++q % 3
q > 3
如你所见, 运算对象可以是常量、 变量或二者的组合。 一些表达式由子表达式(subexpression) 组成(子表达式即较小的表达式) 。 例如, c/d是上面例子中a*(b + c/d)/20的子表达式。每个表达式都有一个值。

C 表达式的一个最重要的特性是, 每个表达式都有一个值。 要获得这个值, 必须根据运算符优先级规定的顺序来执行操作。 在上面我们列出的表达式中, 前几个都很清晰明了。 但是, 有赋值运算符(=) 的表达式的值是什么? 这些表达式的值与赋值运算符左侧变量的值相同。 因此, 表达式q = 5*2作为一个整体的值是10。 那么, 表达式q > 3的值是多少? 这种关系表达式的值不是0就是1, 如果条件为真, 表达式的值为1; 如果条件为假, 表达式
的值为0。

二、语句

语句(statement) 是C程序的基本构建块。 一条语句相当于一条完整的计算机指令。 在C中, 大部分语句都以分号结尾。 因此,
legs = 4
只是一个表达式(它可能是一个较大表达式的一部分) , 而下面的代码则是一条语句:
legs = 4;
最简单的语句是空语句:
; //空语句
C把末尾加上一个分号的表达式都看作是一条语句(即, 表达式语句) 。 因此, 像下面这样写也没问题:
8;

3 + 4;
但是, 这些语句在程序中什么也不做, 不算是真正有用的语句。 更确切地说, 语句可以改变值或调用函数:
x = 25;
++x;
y = sqrt(x);
虽然一条语句(或者至少是一条有用的语句) 相当于一条完整的指令,但并不是所有的指令都是语句。 考虑下面的语句:
x = 6 + (y = 5);
该语句中的子表达式y = 5是一条完整的指令, 但是它只是语句的一部分。 因为一条完整的指令不一定是一条语句, 所以分号用于识别在这种情况下的语句(即, 简单语句) 。

#include

int main(void) /* 计算前20个整数的和 */

{

int count, sum; /* 声明 */

count = 0; /* 表达式语句 */

sum = 0; /* 表达式语句 */

while (count++ < 20) /* 迭代语句 */

sum = sum + count;

printf("sum = %d\n", sum); /* 表达式语句 */

return 0; /* 跳转语句 */

}

三、复合语句

复合语句(compound statement) 是用花括号括起来的一条或多条语句,复合语句也称为块(block) 。 shoes2.c程序使用块让while语句包含多条语句。 比较下面两个程序段:

/* 程序段 1 */
index = 0;

while (index++ < 10)

sam = 10 * index + 2;

printf("sam = %d\n", sam);

/* 程序段 2 */

index = 0;

while (index++ < 10)

{

sam = 10 * index + 2;

printf("sam = %d\n", sam);

}

程序段1, while循环中只有一条赋值表达式语句。 没有花括号, while语句从while这行运行至下一个分号。 循环结束后, printf()函数只会被调用一次。
程序段2, 花括号确保两条语句都是while循环的一部分, 每执行一次循环就调用一次printf()函数。 根据while语句的结构, 整个复合语句被视为一条语句。