现在你应该明白为何“知道源代码中的序列点在哪里”很重要了。下面是一个完整的清单:
完全表达式(full expression):在完全表达式求值的结尾存在一个序列点。完全表达式的 值不被直接作为求解某个其他表达式的一部分使用。举个例子,在上面的函数bar()中,lhs * rhs是一个完全表达式。然而,在函数foo()中,lhs * rhs不是一个完全表达式,因为在计算对 result的赋值中使用了它的结果。
注意,一条语句可以包含不止一个完全表达式。例如,语句
函数调用(function call):两个序列点保护一个函数调用。在所有实参赋值之后立即有一 个序列点,从而函数体可以在“所有初始化形参的副作用已经完成”的假定之上继续执行。第 二个序列点位于返回点,它确保任何提供返回值的副作用在调用该函数的代码恢复执行前已经 完成。
很少有程序员编写的代码存在返回序列点的问题,不过入口的序列点有时会被误解。比 方说,
![]() |
更糟糕的是,如果逗号操作符的至少一个操作数是用户自定义类型,则C++(www.cppentry.com)允许程序员重 新定义它。在那些环境中,它不再是序列操作符,左右操作数(表达式)可以按任意顺序求解。 因此,或许最好假定逗号不是序列操作符,除非你确切地知道它确实是。
条件操作符(conditional operator):在条件操作符的左操作数的求值,和其他两个操作数 中被选中的那一个的求值之间,存在一个序列点。因此
![]() |
|| 和&& 操作符:对于这些操作符的内建版本而言,左操作数(表达式)的求值后面都存 在一个序列点。这意味着左操作数是完全求解的,所有结果的副作用在计算右操作数之前已经 完成。注意,只在有必要确定其结果的时候才会计算右操作数。这意味着求解右操作数的任何 副作用依赖于左操作数的值。
【责任编辑:雪花 TEL:(010)68476606-8007】
| 回书目 上一节 下一节 |

