[整理]x=x++和x=++x
最近看java面试题,再次遇到x=x++,之前一直按照C语言中对自增运算符++的解释去理解。殊不知自己犯了严重的错误。
(1)不同的语言的编译器,会导致相同的代码最终执行的结果不确定;
(2)而且就算是同一种语言,所使用的编译器不同,也可能导致结果的不确定。
在不同的语言下做个实验:
1.C/C++
int x=0;
x=x++;//使用临时变量,临时变量+1后赋值给x
printf("%d",x);//x=1
int x=0;
x=++x;//不使用临时变量,直接在原x上+1
printf("%d",x);//x=1
注意的是,由于+x不产生临时变量,所以性能上要优于x++。
2.C#
int x = 0;
x = x++;
Console.WriteLine(x);//x=0

- 将常量值0压入堆栈;
- 从堆栈中弹出值0赋值给本地变量x,此时x=0;
- 将本地变量x加载到堆栈中;
- 复制当前堆栈顶端的值,即0,(临时变量);
- 把常量值1压入堆栈;
- 堆栈顶端2个值相加,返回新的值1;
- 从堆栈中弹出值1赋值给本地变量x,此时x=1;
- 从堆栈中弹出值0,同样还是赋值给本地变量x,此时x=0;
int x = 0;
x = ++x;
Console.WriteLine(x);//x=1
| nop | 执行没有任何行为的操作 |
| dup | 重复位于堆栈顶端的值 |
| add | 将两个数值相加,并返回一个新数值 |
| neg | 对当前位于堆栈顶部的值执行求反 |
| ret | 从方法返回,可能返回一个值 |
| call methodDesc | 调用由methodDesc描述的方法 |
| ldc.i4 num | 将值num推送到堆栈上 |
| stloc index | 从堆栈中弹出一个值并将其存储在本地变量 index 中,pop value from stack to local variable |
| ldloc index | 将索引 index 处的局部变量加载到堆栈上,load local variable onto the stack |
3.Java
int x=0;
x=x++;
System.out.print(x);//x=0
int x=0;
x=++x;
System.out.print(x);//x=1
4.总结
类似这样x = x++的代码,结果是不定的,结果是由编译器来决定,不同的编译器可能导致不同的结果,所以不建议写类似的代码。
面试倒是时常遇到,所以一定要引起注意。
[整理]x=x++和x=++x的更多相关文章
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- UWP学习目录整理
UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...
- SQL Server 常用内置函数(built-in)持续整理
本文用于收集在运维中经常使用的系统内置函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID') 2,查看对象的 ...
- kafka学习笔记:知识点整理
一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险. ...
- JAVA程序员常用软件整理下载
********为了大家学习方便,特意整理软件下载如下:*************Java类软件:-------------------------------JDK7.0:http://pan.ba ...
- js数组学习整理
原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...
- GJM : C#设计模式汇总整理——导航 【原创】
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 整理下.net分布式系统架构的思路
最近看到有部分招聘信息,要求应聘者说一下分布式系统架构的思路.今天早晨正好有些时间,我也把我们实际在.net方面网站架构的演化路线整理一下,只是我自己的一些想法,欢迎大家批评指正. 首先说明的是.ne ...
- 安卓GreenDao框架一些进阶用法整理
大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...
- (资源整理)带你入门Spark
一.Spark简介: 以下是百度百科对Spark的介绍: Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方 ...
随机推荐
- cadence allegro 封装原点修改
打开 dra文件后 在菜单栏 setup - change drawing origin 在命令栏输入 新的参考点位置 如想更改新坐标位置为 1,2 .输入 x 1 2
- 安装loadrunner11出现Microsoft Visual c++2005 sp1安装失败
本文转至别处,网上大神多
- 前端开发工具icestar
前端开发工具icestar 最近忙里偷闲,把之前的mock工具进行了全面的重构,最大的改变就是换了个名称icestar,icestar意思就是"爱死他",首先他的预想并不只是替代m ...
- Houdini Linux Crack
安装 破解停止服务 /etc/init.d/sesinetd stop 刪除sesinetd | 拷贝破解文件sesinetd | 修改sesinetd的权限(读写权限) cd /usr/lib/se ...
- 使用unity3d和tensorflow实现基于姿态估计的体感游戏
使用unity3d和tensorflow实现基于姿态估计的体感游戏 前言 之前做姿态识别,梦想着以后可以自己做出一款体感游戏,然而后来才发现too young.但是梦想还是要有的,万一实现了呢.趁着p ...
- Unity3d-通过简单示例来理解Time.deltaTime
转载文章: Unity3d-通过简单示例来理解Time.deltaTime 2018年04月21日 18:04:14 Black_Window 阅读数:926 标签: UnityTime 更多 个人分 ...
- 汉码盘点机PDA无缝对接思迅思迅盘点机思迅条码数据采集器批号商品盘点的方法
1.1. 盘点批号 如果某些商品进行了批号管理,我们不仅仅要清点什么商品总数有多少个,我们还要区分该商品的某个批号有多少个数量,因此以前批号盘点工作量是非常大的. 我们的盘点机PDA支持批号盘点 ...
- Theory And Practice
实践出真知,建议不要一味地看Backbone源码和网上解析,自己动手实践吧少年们! 我是一个简单的简直无可救药的小栗子~ ——Silun Wang 我的几个小问题: 1. Rocket介绍没有Todo ...
- 软件工程学习之小学四则混合运算出题软件 Version 1.1 设计思路及感想
继上次采用形式文法来生成混合运算的算式,由于算法中没有引入控制参数而导致容易产生形式累赘(多余的括号等)的算式.本次更新决定采用一种更为简单有效的生成方式,由给出的一个随机的最终答案S,通过给定的一个 ...
- 洛谷P13445 [USACO5.4]奶牛的电信Telecowmunication(网络流)
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...