关于递增操作符(++)的一些讨论
在讨论递增操作符之前先说明几个概念,之后会用到。1、顺序点:程序执行过程中的一个点。在这里,进入下一步之前将确保对所有的副作用都进行了评估。在C++中,语句中的分号就是一个顺序点,这意味着程序处理下一句语句之前,赋值操作符、递增操作符和递减操作符等执行的修改都必须完成。另外,任何完整表达式末尾都是一个顺序点。
2、副作用:在计算表达式时对某些东西(如存储在变量中的值)进行了修改,这种现象称为该表达式具有副作用。
3、完整表达式:它是这样一个表达式,不是另一个更大表达式的子表达式。完整表达式的例子有:表达式语句中的表达式部分以及用作while循环中的检测条件的表达式。
下面正式讨论一下递增操作符:
1、递增操作符有两个版本:前缀版本和后缀版本。
2、前缀递增操作符、前缀递减操作符和解除引用操作符的优先级相同,都以从右往左的方式进行结合。后缀递增操作符、后缀递减操作符的优先级相同,但比前缀版本的操作符的优先级高,这两个操作符以从左往右的方式进行结合。
3、对于一个语句中各表达式均使用完整表达式时,使用递增操作符的前缀版本和后缀版本,两者的最终效果在数值方面没有任何区别。表达式的值未被使用,因此只存在副作用。但是两者的执行速度可能有细微的差别。对于内置类型和当代编译器而言,这看似不是什么 问题。然而C++允许程序员针对类定义这些操作符。对于后缀版本首先复制一个拷贝,将其加1,然后将复制的拷贝返回。因此,前缀版本的效率比后缀版本的效率要高。
4、在语句
while (guests++ < 10)
cout << guests;
中表达式guests++ < 10 是一条完整表达式,因为它是一个while循环的测试条件,因此该表达式的末尾是一个顺序点。所以,C++确保副作用(将guests加1)在程序进入cout << guests之前完成。然后通过递增操作符后缀版本,可确保将guests同10进行比较后再将其值加1.
在语句
y = (4 + x++) + (6 + x++);
中表达式 4 + x++ 不是一个完整表达式。因此,C++不保证x的值在计算子表达式 4 + x++ 后立刻增加1。在这个语句中,整条赋值语句时一个完整表达式,而分号标示了顺序点,因此C++只保证程序执行到下一条语句之前,x的值将被递增两次。C++没有规定是在计算每个子表达式之后将x的值递增,还是在整个表达式计算完毕后才将x的值递增。
这些东西是本人自己通过查阅一些材料,自己总结的。如果有人发现有错误请后面跟帖说明。
希望看到这个贴的朋友,可以加入QQ群125978818,这个群主要针对C++初学者。在群中,我会不定期上传类似文章和大家一起讨论。