(转)后缀++或--何时执行自增或自减操作?(顺序点)
问:在使用后缀形式的++或--时,何时执行自增或自减操作?
答:这是一个非常好的问题,也是一个非常难回答的问题。C语言标准引入“顺序点”的概念,并且指出“应该在前一 个顺序点和下一个顺序点之间对存储的操作数的值进行更新”。在C语言中有多种不同类型的顺序点,表 式语句的末尾是其中一种。在表达式语句的末尾,该语句中的所有自增和自减操作都必须执行完毕,否则不能执 行下一条语句。
一些运算符(逻辑与,逻辑或,条件和逗号)对顺序点也有影响。函数调用也是如此:在函数调用执行之前,所 有的实际参数必须全部计算出来。如果实际参数恰巧是含有++或--运算符的表达式,那么必须在调用前进行自 增自减操作。
问:C语言为什么提供++和--运算符?它们是比其它的自增,自减方法执行得快,还是仅仅更便捷?
答:C语言从ken Thompson早期的B语言中继承了++和--。 Thompson创造这类运算符是因为他的B语言编译器可以 对++i产生比i = i + 1更简洁的翻译。这些运算符已经成为C语言 根深蒂固的组成部分(事实上,许多最著名的 C语言惯用法都依赖于这些运算符)。对于现代编译器而言,使用++和--不会使编译器的程序变得更短小或更 快,继续普及这些运算符主要是由于它们的简洁和便利。
(摘自 C语言设计现代方法)
有哪些点是顺序点:
- ·分号;
- ·未重载的逗号运算符的左操作数赋值之后(即“,”处);
- ·未重载的”||”运算符的左操作数赋值之后(即“||”处);
- ·未重载的“&&”运算符的左操作数赋值之后(即"&&"处);
- ·三元运算符“? : ”的左操作数赋值之后(即“?”处);
- ·在函数所有参数赋值之后但在函数第一条语句执行之前;
- ·在函数返回值已拷贝给调用者之后但在该函数之外的代码执行之前;
- ·每个基类和成员初始化之后。