自加自减运算符的错误使用和理解【个人学习笔记,如有错误欢迎指正】
2017-08-30 18:09
375 查看
自加自减运算符的错误使用
int a = 1; printf("%d %d %d\n",a,a++,++a);
输出结果为:3 2 3
int a = 1; printf("%d ",a); printf("%d ",a++); printf("%d\n",++a);
输出结果为:1 1 3
由此可见,将多个自加自减运算符放入同一语句中是不合适的(不同编译器可能输出结果不同)。因为这是一种C语言中未定义的行为,即C语言并没有规定多个表达式的运算(求值)顺序,所以在不同编译器中得到的结果是不同的。故最好只在一条语句中只使用一次自加自减运算符。
另外,对常量(constant)使用自加自减运算符是不合法的,因为常量的值是不能改变的。假设X+Y=3,即便(X+Y)++后等于4,但由于(X+Y)++没有L-value,则结果还是无处可放。【自加自减运算符要求操作数(operant)必须具有L-value】
自加自减过程的错误理解
b = a++; (1)
如这样一条语句,可能会错误的理解为先把a的值赋给b,然后a再自加。但这样的理解是错误的。最简单的一条证据就是++的运算符优先级(Operator Precedence)比赋值运算符要高。
对自加自减过程(后置)的正确理解
标准C规定,表达式a++的R-value是等于a的R-value。为了保存a++后的R-value,系统将自动生成一个临时变量暂存i的R-value。在执行完a=a+1后,返回保存在临时变量里的a的R-value作为a++的R-value,随即释放临时变量存储单元。因此对与语句(1)的执行过程相当于:temp = a; a = a+1; return temp; b = temp
注意:赋值过程依然在a自加以后。
对自加自减过程(前置)的理解
类似于前者,标准C规定,表达式++a的R-value是等于a+1后的值,即先做a=a+1,然后再返回a+1的值。过程相当于a = a+1; return a;
相关文章推荐
- 对于指针(一级指针)的理解(文中如有理解错误,欢迎指正,大家互相学习)
- 关于QTreeView和QStandardModel联合理解,外加显示委托的理解(学习笔记,如有错误还望指出)
- 安卓学习笔记---使用AndroidStudio出现的问题错误(错误: -source 1.6 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算)
- java学习笔记(word文档备注不能正常显示,如有错误,忘不吝指正)
- Z-Stack的运行角度的理解(仅作个人学习笔记,希望别人评指正)
- 经验总结。持续更新,全部个人理解,如果错误欢迎指正
- DOS命令个人学习使用笔记
- [每日学习笔记][2012.07.10]使用Java理解程序逻辑(三)
- [每日学习笔记][2012.07.09]使用Java理解程序逻辑(一)
- [每日学习笔记][2012.07.15]使用Java理解程序逻辑(八)
- Android中遇到的一切BUG(到目前为止,这是我笔记薄别瞎喷,错误欢迎指正)
- Silverlight学习笔记一(理解一下机制,使用一下布局,实现一个简单的用户登录)
- [每日学习笔记][2012.08.03]使用Java理解程序逻辑(十一)
- [每日学习笔记][2012.07.10]使用Java理解程序逻辑(七)
- [每日学习笔记][2012.07.10]使用Java理解程序逻辑(五)
- cocos2d-x 【小菜在学习】锚点与位置个人理解笔记
- PHP学习笔记(23)PHP的数据类型与常量使用(24)PHP的运算符与表达式
- Effective C# 学习笔记(四十二)理解Expression API的使用方式
- [每日学习笔记][2012.08.02]使用Java理解程序逻辑(九)
- Sharepoint学习笔记---Debug--使用ULS Log跟踪Solution错误信息