C Primer Plus 第5章 运算符、表达式和语句 5.4 表达式和语句

原创
2016/05/20 06:19
阅读数 134

5.4.1 表达式

表达式是由运算符和操作数组合构成的。最简单的表达式是一个单独的操作数,以此作为基础可以建立复杂的表达式。

每一个表达式都有一个值

C的一个重要属性是每一个C表达式都有一个值。

5.4.2 语句

语句是构造程序的基本成分。程序是一系列带有某种必须的标点的语句集合。一条语句是一条完整的计算机指令。在C中,语句用结束处的一个分号标识。

什么构成了一条完整的指令?首先,C把任何后面加有一个分号的表达式看处是一个语句。

尽管一个语句(或者至少是一个有作用的语句)是一条完整的指令,但不是所有完整的指令都是语句。分号用来识别确实是语句的指令。

程序清单 5.13

/*addemup.c--4种类型的语句*/
#include <stdio.h>
int main()
{
    int count,sum;    /*声明语句*/
    
    count=0;          /*赋值语句*/
    sum=0;            /*同上   */
    while (count++<20)/*while 语句*/
    {
        sum=sum+count;
    };
    print("sum=%d\n",sum);/*函数语句*/
    return 0;
}

上例中已经遇到了四种语句:

注意一个声明语句不是一个表达式;

赋值语句,它为变量分配一个值。赋值语句是表达式语句的一个特例。

函数语句引起函数的执行。

while语句有三个不同的部分,首先是while关键字,然后是在圆括号里的一个判断条件,最后是满足判断条件时将执行的语句。while语句属于一类有时被称为结构化语句的语句。

副作用和顺序点

副作用是对数据对象或文件的修改。例如语句states=50;的副作用是将变量states的值设置为50.这是副作用?这看起来更像是主要目的!然而,从C的角度来看,主要目的是对表达式求值。

给C的一个表达式4+6,C将计算它的值为10,给C一个表达式 states=50 ,C将计算它的值为50,计算这个表达式的副作用就是把变量states的值改变为50.增量和减量运算符也有副作用,它们主要由于副作用而被应用。

一个顺序点(sepuence point)是程序执行中的一点;在该点处,所有的副作用都在进入下一步前被计算。在C中,语句的分号标志了一个顺序点。它意味着在一个语句中赋值运算符、增量及减量运算符所做的全部改变都必须在进入下一个语句前发生。任何一个完整的表达式的结束也是一个顺序点。

什么是一个完整的表达式呢?它不是一个更大的表达式的子表达式。完整表达式的例子包括一个表达式语句里的表达式和一个在while循环里作为判断条件的表达式。

顺序点帮助阐明后缀增量动作何时发生。例如:

while (guests++<10)

printf("%d \n",guests);

有时初学者会设想在本程序中“先使用该值,然后增加它的值”的意思是在使用了printf()语句后再增加guest的值。然而,guests++<10是while循环的判断条件,所以它是一个完整的表达式,这个表达式的结束就是一个顺序点。因此C保证副作用(增加guests的值)在进入printf()前发生。

同时使用后缀形式保证了guests在与10比较后才增加。

现在考虑这个语句:

y=(4+ x++)+(6+ x++);

表达式4 + x++不是一个完整表达式,所以C不能保证在计算子表达式4+x++后立即增加x。这里完整表达式是整个语句,并且分号标记了顺序点,所以C能保证的是在程序进入后续语句前x将被 增加两次。C没有指明X是在每个子表达式计算后被增加还是整个表达式被计算后增加,这就是我们要避免使用这类语句的原因。

5.4.3 复合语句(代码块)

复合语句是用花括号组织起来的两个或更多的语句;它也被称为代码块。

展开阅读全文
打赏
2
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
2
分享
返回顶部
顶部