C Primer Plus 第5章 运算符、表达式和语句 5.4 表达式和语句
2016-05-20 00:00
344 查看
摘要: 语句组成了C语言的的基本程序步骤,并且大多数语句由表达式构成。
5.4.1 表达式
表达式是由运算符和操作数组合构成的。最简单的表达式是一个单独的操作数,以此作为基础可以建立复杂的表达式。
每一个表达式都有一个值
C的一个重要属性是每一个C表达式都有一个值。
5.4.2 语句
语句是构造程序的基本成分。程序是一系列带有某种必须的标点的语句集合。一条语句是一条完整的计算机指令。在C中,语句用结束处的一个分号标识。
什么构成了一条完整的指令?首先,C把任何后面加有一个分号的表达式看处是一个语句。
尽管一个语句(或者至少是一个有作用的语句)是一条完整的指令,但不是所有完整的指令都是语句。分号用来识别确实是语句的指令。
程序清单 5.13
上例中已经遇到了四种语句:
注意一个声明语句不是一个表达式;
赋值语句,它为变量分配一个值。赋值语句是表达式语句的一个特例。
函数语句引起函数的执行。
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 复合语句(代码块)
复合语句是用花括号组织起来的两个或更多的语句;它也被称为代码块。
5.4.1 表达式
表达式是由运算符和操作数组合构成的。最简单的表达式是一个单独的操作数,以此作为基础可以建立复杂的表达式。
每一个表达式都有一个值
C的一个重要属性是每一个C表达式都有一个值。
5.4.2 语句
语句是构造程序的基本成分。程序是一系列带有某种必须的标点的语句集合。一条语句是一条完整的计算机指令。在C中,语句用结束处的一个分号标识。
什么构成了一条完整的指令?首先,C把任何后面加有一个分号的表达式看处是一个语句。
尽管一个语句(或者至少是一个有作用的语句)是一条完整的指令,但不是所有完整的指令都是语句。分号用来识别确实是语句的指令。
程序清单 5.13
[code=language-objectivec]/*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 复合语句(代码块)
复合语句是用花括号组织起来的两个或更多的语句;它也被称为代码块。
相关文章推荐
- On Error Resume Next 语句
- Lua学习笔记之运算符和表达式
- Lua教程(三):表达式和语句
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- SQL语句实现查询SQL Server服务器名称和IP地址
- SQL Server的基本功能性语句介绍
- Ruby中case表达式详解
- SQL语句实现查询并自动创建Missing Index
- 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程
- SQL语句实现查询SQL Server内存使用状况
- SQL语句性能优化(续)
- SQL语句优化提高数据库性能
- C++表达式new与delete知识详解
- 剖析C++中的常量表达式与省略号的相关作用
- 实例详解C#正则表达式
- C++利用链栈实现表达式求值
- 比较实用SQL语句总结
- Ruby的运算符和语句优先级介绍
- 将表里的数据批量生成INSERT语句的存储过程 增强版