C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.4 表达式和语句

5.4 表达式和语句
表达式(expression)和语句(statement)。
C的基本程序步骤由语句组成,而大多数语句由表达式构成。
5.4.1 表达式语句
表达式(expression)由运算符和运算对象组成。最简单的表达式是一个单独的运算对象,以此为基础可以建立复杂的表达式。
运算对象可以是常量、变量或者二者的组合。一些表达式由子表达式(subexpression)组成(子表达式即较小的表达式)。
每个表达式都有一个值
C表达式的一个最重要的特性是,每个表达式都有一个值。要获得这个值,必须根据运算符优先级规定的顺序来执行操作。赋值表达式的值与赋值运算符左侧变量的值相同。关系表达式的值不是0就是1,如果条件为真,表达式的值为1;如果条件为假,表达式的值为0。
6 + (c = 3 + 8)的值为17。在C中完全合法,因为它是两个子表达式的和,每个子表达式都有一个值。
5.4.2 语句
语句(statement)是C程序的基本构建块。一条语句相当于一条完整的计算机指令。在C中,大部分语句都以分号结尾。
最简单的语句是空语句:;
C把末尾加上一个分号的表达式都看作是一条语句(即,表达式语句)。
更确切地说,语句可以改变值或调用函数。
虽然一条语句(或者至少是一条有用的语句)相当于一条完整的指令,当并不是所有的指令都是语句。 例如: 
x = 6 + (y = 5);
该语句中的子表达式y = 5是一条完整的指令,但是它只是语句的一部分。因为一条完整的指令不一定是一条语句,所以分号用于识别在这种情况下的语句(即,简单语句)。
/* addemup.c -- five kinds of statements */
#include <stdio.h>
int main(void)                /* finds sum of first 20 integers */
{
    int count, sum;           /* declaration statement          */
    
    count = 0;                /* assignment statement           */
    sum = 0;                  /* ditto                          */
    while (count++ < 20)      /* while                          */
        sum = sum + count;    /*     statement                  */
    printf("sum = %d\n", sum);/* function statement             */
    
    return 0;                 /* return statement               */

/* 输出:

*/ 

根据C标准,声明不是语句。这与C++有所不同。
在C语言中,赋值和函数调用都是表达式。没有所谓的“赋值语句”和“函数调用语句”,这些语句实际上都是表达式语句。
声明创建了名称和类型,并为其分配了内存位置。注意,声明不是表达式语句,也就是说,如果删除声明后面的分号,剩下的部分不是一个表达式,也没有值。
int port /*不是表达式,没有值*/
赋值表达式语句的结构是,一个变量名,后面是一个赋值运算符,再跟着一个表达式值,最后以分号结尾。
函数表达式语句会引起函数调用。
多条语句需要用花括号括起来。这种语句是复合语句。
while语句是一种迭代语句,有时也称为结构化语句,因为它的结构比简单的赋值表达式语句复杂。
副作用和序列点
C语言的术语副作用(side effect)。副作用是对数据对象或文件的修改。
states = 50;
它的副作用是将变量的值设置为50。副作用?这似乎更像是主要目的!但是从C语言的角度看,主要目的是对表达式求值。
递增和递减运算符也有副作用,使用它们的主要目的就是使用其副作用。
类似地,调用printf()函数时,它显示的信息其实是副作用。
序列点(sequence point)是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生。在C语言中,语句中的分号标记了一个序列点。意思是,在一个语句中,赋值运算符、递增运算符和递减运算符对运算对象做的改变必须在程序执行下一条语句之前
完成。另外,任何一个完整表达式的结束也是一个序列点。
所谓完整表达式(full expression),就是指这个表达式不是另一个更大表达式的子表达式。
序列点有助于分析后缀递增何时发生。
while( guests++ < 10 ){
    printf( "%d\n", guests );

表达式guests++ < 10是一个完整的表达式,因为它是while循环的测试条件,所以该表达式的结束就是一个序列点。因此,C保证了在程序转至执行printf()之前发生发生副作用。同时,使用后缀形式保证了guests在完成与10的比较后才进行递增。
5.4.3 复合语句(块)
复合语句(compound statement)使用花括号括起来的一条或多条语句,符合语句也称为块(block)。
提示 风格提示
while( ... )
{
    ...

注意循环中的缩进。缩进对编译器不起作用,编译器通过花括号和while循环的结构来识别和解释指令。缩进是为了让读者一眼就可以看出程序是如何组织的。
块或复合语句放置花括号的位置是一种常见的风格。 
while( ... ){
    ...
}
这种风格突出了块附属于while循环,而前一种风格则强调语句形成一个块。
总而言之,使用缩进可以为读者指明程序的结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值