首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

javai++ ++i区别

今天同事扔给我两道面试题,由于我2年前就接触过这道题,所以没啥意思,我看完后扔到一个交流群里,回答这道题绝大部分人竟然都答错了;很多人很清晰知道这两道题想考察面试者对 i++ ++i 理解...,也很清晰知道这二者区别,但是题还是做不对;两道题如下,大家可以先思考一下,给个答案,然后再去验证自己想法。...(这是一道典型看着非常简单题,但是不少人还是会因为粗心栽跟头) 第一题: int a = 0; for (int i = 0; i < 99; i++) {...(int i = 0; i < 99; i++) { b = ++ b; } System.out.println(b); 我估计会有不少人做错...i++ ++i 在理论上区别是: i++:是先把i拿出来使用,然后再+1; ++i :是先把i+1,然后再拿出来使用; 答案见下: 第一题:a=0 第二题:b=99 再升级一下 第三题

1.2K30

java i = i++ j = i++ 区别

由于i++i--使用会导致值改变,所以在处理后置++--时候,java编译器会重新为变量分配一块新内存空间,用来存放原来值, 而完成赋值运算之后,这块内存会被释放。...i原始值存放在后开辟内存,最后将这个值赋给j,进行j = i++运算之后,j会得到i值,而i又将自加,所以,在释放内存之后,原来存放ji地方将得到值分别是:j(此时值等于初始i值)i...每一次循环结束,用来保存i原始值内存数据会被销毁,然后i值又会被放在一段新内存,在进行上述循环,所以最终能够实现j数据增加。 (2)对于i = i++情况 ?...扩展: 微软windows下visualstudio编译结果java不同,但在gcc等其他c语言编译器下,结果java是一样,千万要注意,由于有些人使用是c语言编译器但不是windows...下编译器,结果仍然java一致,但在windows下编译运行结果却不一样,希望能引起读者注意。

1.3K100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【118期】面试官:你真的清楚 i = i++ i = ++i 区别

    "i="+i); System.out.println("j="+j); System.out.println("k="+k); } } 你能肯定并且准确说出你答案...结果:i在局部变量表变成了2,操作数栈 i 值为1,并且将 i 值返回给 j,即此条语句以后,i = 2,j = 1 2.4、第四步 int k = i + ++i * i++ ?...结果:局部变量表i = 4,k = 11 2.5、结果 ? 3、i = ++i 按理说根据上面的分析过程,再来分析 i = ++i,就很简单了。...我们 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈数据返回给我们变量 i 。...; System.out.println(i); // 结果:i = 2 } } 最后最后:本文思考过程计算推导仅针对Java语言。

    1.5K10

    面试官:i = i++ i = ++i 有什么区别

    "i="+i); System.out.println("j="+j); System.out.println("k="+k); } } 你能肯定并且准确说出你答案...其中一个方法对应一个栈帧 此题目我们只需要用到栈帧里面的局部变量表操作数栈 2.1、第一步 int i = 1 只是一个简单赋值操作 2.2、第二步 i = i++ 结果:i还是等于1 2.3、第三步...int j = i++ 结果:i在局部变量表变成了2,操作数栈 i 值为1,并且将 i 值返回给 j,即此条语句以后,i = 2,j = 1 2.4、第四步 int k = i + ++i *...i++ 结果:局部变量表i = 4,k = 11 2.5、结果 3、i = ++i 按理说根据上面的分析过程,再来分析 i = ++i,就很简单了。...我们 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈数据返回给我们变量 i

    1.2K20

    【答疑解惑】i++,++ii+=区别

    表达式 a = i++; 它等价于 a = i ; i = i + 1; 表达式 a = ++i 它等价于 i = i + 1; a = i; 1、 首先两者区别是:前者是先赋值,然后再自增;...后者是先自增,后赋值 2、 ++i i++ 使用,一般来说在循环域里面,这两者并没有什么很大区别,因为编译器一般都会给你做优化。...但是要注意其生存周期,我们要注意i值在程序流变化,如果是for、while循环判断要特别注意++i值比i++值要提前。...没有结果,因为不同编译器做出来结果,你要纠结这个,哎我只能说那些书上纯粹是搞人。 以上我们只需记住先序后续递增,循环判断时条件即可。...i += 2; 这个是 i = i + 2; 自身值加上2后赋值给自己。这个没有争议。 来骚年练习一下 i += (++i)+(++i)+(++i); 呵呵!!!

    1.6K50

    图解 i++ ++i 区别!看了必懂

    先看一段代码: int i = 0; int a = i++; sout("a值是:"+i); sout("i值是:"+i); 最终编译之后核心字节码如下 L0 BITPUSH 0 //将常量...0压入操作栈 ISTORE_1 //将当前栈顶元素,弹出并保存到局部变量表slot_1 L1 ILOAD_1 //从局部变量表第一个slot槽,取出该值,压入操作栈顶 IINC 0,1...//直接将slot槽值自增(+1)操作,注意此时是与当前栈无关 ISTORE_2 //将当前栈顶元素,弹出并保存到局部变量表slot_2 L2 ILOAD_2 //从局部变量表第二个...slot槽,取出该值,压入操作栈顶 IRETURN //返回栈顶元素 这里有两个注意点: IINC 自增操作,并未影响当前栈顶元素,并且 slot_1 元素自增完成后,已经由0变成了1...//从局部变量表第二个slot槽,取出该值,压入操作栈顶 IRETURN //返回栈顶元素 最终输出结果为: a值是: 1 i值是: 1; 总结 i++ ++i 在理论上区别

    41820

    ++ii++仅仅是先加1后加1区别

    没错,关于二者之间区别,的确可以这么认为,并且按照上面的方法操作,运算也基本不会有什么错误。但是如果我告诉你,后置++ 其实与前置++一样,在参与运算之前都会将变量加1,你会信?...System.out.println("prePlus4:i=" + i); } } 程序并不复杂,就是使用前置++后置++。...,然后才继续计算,,二者之间真正区别是:前置++是将变量值加1后,使用增值后变量进行运算,而后置++是首先将变量赋值给一个临时变量,接下来对变量值加1,然后使用临时变量进行运算,从效果上来讲...j=temp*30; //使用临时变量Temp进行运算,j结果为60 进一步探索 接下来我们来研究一下前置++与后置++区别,为了能更好说明该问题,先列出一个非常简单程序: public class...1存储int类型值压入栈,即将i值0压入栈, //这在程序中就相当于将i值赋给一个临时变量temp,此时temp值为0 2: iload_1 //将局部变量1值加1,也就是将i值加1.在程序这个相当于

    1.6K20

    从 JVM 层面理解 i++ ++i 真正区别

    前言 如果只用普通知识解释i++++i的话 i++ 先将i赋值再++ ++i 先++再赋值 但是这简单回答并不能入吸引面试官眼球,如果用java字节码指令分析则效果完全不同。...代码实现 public class OperandStackTest { /** 程序员面试过程, 常见i++++i 区别 */ public static void...位置值+1,然后将局部变量表0位置数入栈执行输出操作 所以i1值为11 先将i2值为10入栈(bipush),然后将int类型值从栈存到局部变量表1位置,然后执行iinc将1位置值+1,...然后将局部变量表1位置数入栈执行输出操作 所以i2值为11 总结 由于没有赋值操作,区别不大。...i9加一 此时i9=10+1+1为12,然后将8位置i9入栈,执行add将栈i9相加,得到值存储到局部变量表9位置 所以i10=10+12(i9++后还是10,++i9后是12,因为执行了两次

    76330

    短文:用字节码解析i++++i区别

    毕竟计算机不认识你java程序。因为它不是人。 要理解这个字节码,首先要明白,方法执行就是操作栈帧,栈帧包含了操作数栈本地变量表这两个概念。...istore_1就是操作数栈出栈,存到本地变量表第1位置i,就是代码i = 8; iload_1,就是变量表第一个位置i压栈到操作数栈顶,此时栈顶为8 iinc 1 by 1,就是变量表第一个位置...i加1,那么变量表最终i=9 istore_1,又把栈顶8存回了变量表i,那么i=8; 因为java代码又赋值给了i。...0 bipush 8 把8压到操作数栈 2 istore_1 操作数栈出栈,存到本地变量表第1位置i,就是代码i = 8; 3 iinc 1 by 1 变量表第一个位置i加1,那么变量表最终.../System.out> 11 iload_1 12 invokevirtual #3 15 return 关于i++,++i字节码指令JVM

    82120

    深入解析i++++i区别及性能影响

    尽管它们看起来相似,但它们之间存在微妙而重要区别。在本文中,我们将详细解释i++++i之间区别,以及它们对代码性能影响。...ii.jpg i++ ++i 区别 i++操作符:这是一个后缀自增操作符。它会先使用变量的当前值,然后再将变量值加1。...="+ i); } } 在这个例子,a值将是3,而i值将是4。...性能分析 在编译器i++++i性能差异通常是微不足道,因为编译器会进行优化以提高代码执行效率。然而,在某些特定情况下,它们性能差异可能会对代码整体效率产生微小影响。...++i性能影响:相比之下,++i不需要保存原始值,因此它可能会更加高效。它只需一次自增操作。 总结 尽管i++++i操作符看起来很相似,但它们在变量自增时间点上有着微妙区别

    76220

    从 JVM 层面理解 i++ ++i 真正区别

    前言 如果只用普通知识解释i++++i的话 i++ 先将i赋值再++ ++i 先++再赋值 但是这简单回答并不能入吸引面试官眼球,如果用java字节码指令分析则效果完全不同。...代码实现 public class OperandStackTest { /** 程序员面试过程, 常见i++++i 区别 */ public static void...+1,然后将局部变量表0位置数入栈执行输出操作 所以i1值为11 先将i2值为10入栈(bipush),然后将int类型值从栈存到局部变量表1位置,然后执行iinc将1位置值+1,然后将局部变量表...1位置数入栈执行输出操作 所以i2值为11 总结 由于没有赋值操作,区别不大。...i9,在将8处i9加一 此时i9=10+1+1为12,然后将8位置i9入栈,执行add将栈i9相加,得到值存储到局部变量表9位置 所以i10=10+12(i9++后还是10,++i9后是12

    29020

    从JVM层面来解释i++++i真正区别

    前言 如果只用普通知识解释i++++i的话 i++ 先将i赋值再++ ++i 先++再赋值 但是这简单回答并不能入吸引面试官眼球,如果用java字节码指令分析则效果完全不同。...代码实现 public class OperandStackTest { /** 程序员面试过程, 常见i++++i 区别 */ public static void...先将i1值为10入栈(bipush),然后将int类型值从栈存到局部变量表0位置,然后执行iinc将0位置值+1,然后将局部变量表0位置数入栈执行输出操作 所以i1值为11 先将i2值为...10入栈(bipush),然后将int类型值从栈存到局部变量表1位置,然后执行iinc将1位置值+1,然后将局部变量表1位置数入栈执行输出操作 所以i2值为11 总结 由于没有赋值操作,区别不大...i9=10+1+1为12,然后将8位置i9入栈,执行add将栈i9相加,得到值存储到局部变量表9位置 所以i10=10+12(i9++后还是10,++i9后是12,因为执行了两次iinc操作

    39920

    i++++i联系与区别!超详细原理分析!

    关于 i++ ++i 区别,稍微有经验程序员都或多或少都是了解,为了文章完整性,本文也通过实例来简单地解释一下。...上面的例子可以看到,无论是 i++ ++i 指令,对于 i 变量本身来说是没有任何区别的,指令执行结果都是 i 变量值加 1。而对于 j 来说前 ++ 后 ++ 结果却不一样了。...2) 2. i++ ++i 实现原理 接下来让我们深入到编译后字节码层面上来了解 i++ ++i 实现原理,为了方便对比,将这两个指令分别放在 2 个不同方法执行,源代码如下: /**...正常来讲,执行结果应该是:i = 1,实际结果却是:i = 0,这多少会让人有些诧异。为什么会出现这种情况呢?我们来从编码后代码找答案。...上面上面的两端代码唯一差别就是 i++ 结果有没有赋值给 i ,但是输出 i 结果一个加了1,而1个没有加。这是为什么呢?

    1.3K40

    i++ ++i 之间区别详细解释(后缀与前缀)

    我看到不少博客对于 i++ ++i 解释都模糊不清,新手看了肯定一脸懵逼,甚至有些人解释是完全错,今天我来给大家详细地解释一下。...两者之间有区别 let i = 3; const j = i++; let i = 3; const j = ++i; ---- 嗯,是。第一个示例使用后缀增量运算符(i++)。...第二个示例使用前缀增量运算符(++i)。起初,似乎没有什么区别。但是,重要是要了解这里发生事情: 后缀增量运算符使该值递增,并在递增之前返回该值。 前缀增量运算符使值递增,并在递增之后返回值。...是j值不同。因此,重要是要知道postfix(后缀)prefix(前缀)之间微小差异。 顺便说一下,这同样也适用于后缀减量前缀减量运算符(--)。...唯一区别是,--没有增加值,而是减少了值。 这就是所有我要说。我希望我能把区别说清楚了。再见! 最后,不要忘了❤或支持一下哦

    93830

    【sed学习】sed -ised -i -e有什么区别

    :ipv4lld_exec:s0' sepolicy/file_contexts不太清楚sed -ised -i -e有什么区别,学习一下 sed -i sed -i -e 是用于编辑文件匹配模式命令...它们区别在于 -e 选项。 sed -i:直接编辑文件,并将结果写回原始文件。不需要指定脚本文件。...以下是几个示例: 将文件所有 “apple” 替换为 “orange”: sed -i 's/apple/orange/g' file.txt 删除文件包含特定字符串行: sed -i '/pattern...\New line' file.txt 以上示例展示了 sed -i sed -i -e 之间一些区别,后者可用于更复杂编辑任务。...请根据具体需求选择适合命令选项。 学习使用 sed 命令可以帮助你在文本处理实现强大编辑转换功能。

    69610
    领券