展开

关键词

javai=i++问题分析

程序的执行顺序是这样的:因为++在后面,所以先使用i,“使用”的含义就是i++这个表达式的值是0,但是并没有做赋值操作,它在整个语句的最后才做赋值,也就是说在做了++操作后再赋值的,所以最终结果还是0让我们看的更清晰点 :这是java里的实现,当然在其他的语言如c或是c++中可能并不是这么处理的,每种语言都有各自的理由去做相应的处理。

17210

javai=i++问题分析

程序的执行顺序是这样的:因为++在后面,所以先使用i,“使用”的含义就是i++这个表达式的值是0,但是并没有做赋值操作,它在整个语句的最后才做赋值,也就是说在做了++操作后再赋值的,所以最终结果还是0让我们看的更清晰点 :这是java里的实现,当然在其他的语言如c或是c++中可能并不是这么处理的,每种语言都有各自的理由去做相应的处理。

16330
  • 广告
    关闭

    50+款云产品免费体验

    提供包括云服务器,云数据库在内的50+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

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

    javai++ 和 ++i的区别

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

    33830

    javai = i++和 j = i++ 的区别

    由于i++和i--的使用会导致值的改变,所以在处理后置的++和--的时候,java的编译器会重新为变量分配一块新的内存空间,用来存放原来的值,而完成赋值运算之后,这块内存会被释放。 i的原始值存放在后开辟的内存中,最后将这个值赋给j,进行j = i++运算之后,j会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到的值分别是:j(此时的值等于初始i的值)和i 总结:  Java编译器每次遇到自增(指的是i++)、自减(指的是i--)运算符的时候都会开辟一块新的内存空间来保存赋值之前j的值,即为缓存变量,然后再将这个换成变量的值赋给左边的变量。 扩展: 微软的windows下的visualstudio编译的结果和java不同,但在gcc等其他的c语言编译器下,结果和java是一样的,千万要注意,由于有些人使用的是c语言的编译器但不是windows 下的编译器,结果仍然和java的一致,但在windows下的编译运行结果却不一样,希望能引起读者的注意。

    524100

    Java中关于i=i++的问题解些

    本文在JVM指令层次讲解i=i++之后,i的值不变的问题。. + VS ++i在平时的讲解中,”i++“ 这条指定会在完成整个语句运算后执行,”++i“ 这条指令会在整个语句运算前执行。 实例讲解i=i++现在有一段代码如下 public void afterPlus() { int i = 0; i = i++; Assert.assertEquals(0, i);}编译成指令后,其中 然后ISTORE指令又将栈上的i的原始变量值付给了本地变量i。所以i相当于没做操作。 i=++i代码如下 public void beforePlus() { int i = 0; i = ++i; Assert.assertEquals(1, i);}}编译成指令后,其中i=i++的指令如下

    16110

    漫画:奇怪,为什么在Java中 2*(i*i) 比 2*i*i 快?

    既然我设计的两只小萌宠出场了,也该它们的粑粑出场了,今天这篇文章,我们通过一个故事来深入聊聊 Java 编译背后的秘密。 但是如果你把 2*i*i 替换成 2*(i*i),执行时间大概在 0.50s ~ 0.55s。对这段程序的两个版本分别执行 15 次,得到的结果如下。 2*i*i 的字节码如下。2*(i*i) 的字节码如下。我们可以发现除了字节码顺序不同外,没有其它异常,下一步该怎么办呢? 我这里就说一下结论,通过对比分析,我们会发现,2*i*i 进行了大量的堆栈操作,因此,需要保存大量的中间结果;而 2*(i*i) 只有少量的堆栈操作。 显而易见,2*(i*i) 比 2*i*i 快是由于 JIT 优化的结果。-END-

    27420

    java基础|验证i++的线程不安全

    ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~https:www.javastudy.cloudi++的线程不安全i+ +是我们从开始学写代码时就一直在写的一个语句,也时常有前辈说过,i++是线程不安全的,我们今天就来一起模拟下多个线程同时对i进行++操作代码如下:import java.util.concurrent.CountDownLatch = 0; i < 1000; i++) { Thread t = new Thread(runnable); t.start(); } 这里调用latch.countDown方法,让计数器减为0,则所有暂停的线程都可以执行 +后i的值 System.out.println(counter.i); } ** * 使用内部类的方式,封装ii++操作 *static class TestCounter {int i = 0; void add() { i++; } }}输出结果如下:多次运行会有不同的结果 ?

    30120

    京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?

    http:blog.csdn.netFansUnionarticledetails79625308 Java并发编程之CAS http:blog.csdn.netFansUnionarticledetails79494554 可以参考http:blog.csdn.nettaohuaxinmu123articledetails24472073中对Java虚拟机栈(Java Virtual Machine Stacks)的说明。 如果是类的成员变量,i++则不是线程安全的,因为i++会被编译成几句字节码语句执行,可以通过synchronize块来提供同步。 因为传统的锁机制需要陷入内核态,造成上下文切换,但是一般持有锁的时间很短,频繁的陷入内核开销太大,所以随着机器硬件支持CAS后,JAVA推出基于compare and set机制的AtomicInteger 五、由于线程共享栈区,不共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全。2. AtomicInteger 和 各种 Lock 都可以确保线程安全。

    10410

    京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?

    http:blog.csdn.netFansUnionarticledetails79625308 Java并发编程之CAS http:blog.csdn.netFansUnionarticledetails79494554 可以参考http:blog.csdn.nettaohuaxinmu123articledetails24472073中对Java虚拟机栈(Java Virtual Machine Stacks)的说明。 如果是类的成员变量,i++则不是线程安全的,因为i++会被编译成几句字节码语句执行,可以通过synchronize块来提供同步。 二、非线程安全,    用 AtomicInteger 即可三、++i的操作肯定是线程安全的。四、如果是我答这道题:先说不是原子的,因为这个是分为三步,读值,+1,写值。 因为传统的锁机制需要陷入内核态,造成上下文切换,但是一般持有锁的时间很短,频繁的陷入内核开销太大,所以随着机器硬件支持CAS后,JAVA推出基于compare and set机制的AtomicInteger

    7810

    一道非常棘手的 Java 面试题:i++ 是线程安全的吗?

    相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼。内心肯定还在质疑,i++ 居然还有线程安全问题?只能说自己了解的不够多,自己的水平有限。 static int count = 0; static CountDownLatch cdl = new CountDownLatch(1000); *** 微信公众号:Java面经*public static = 0; i < 1000; i++) { new Thread(countRunnable).start(); } cdl.await(); System.out.println(count);} static class CountRunnable implements Runnable { private void count() { for (int i = 0; i < 1000; i++) { count 1、对 i++ 操作的方法加同步锁,同时只能有一个线程执行 i++ 操作;2、使用支持原子性操作的类,如 java.util.concurrent.atomic.AtomicInteger,它使用的是

    27620

    Java基础面试题i = i++ 执行原理

    直接来代码吧:public static void main(String[] args) { int i = 10; i = i++; 输出结果为: i = 10 System.out.println (i = + i); * i = i++;这条语句相当于以下三条语句: 1) int temp = i; 先把i变量的值10保存到临时变量中 2) i = i+1; i变量的值加1操作 3) i = temp; 再把临时变量中的值赋值给i * }

    35300

    i = i++真的很简单?CC++,java,php探秘

    今天阅读《编写高质量代码:改善Java程序的151个建议》,其中一个是自增的陷阱,才感受到自己对自增的理解还不够,看看下面这些代码的结果是什么。 java中public static void main(String){ int count1 = 0; int count2 = 0; for (int i = 0; i < 10; i++) { using namespace std; int _tmain(int argc, _TCHAR* argv[]){ int count1 = 0; int count2 = 0; for (int i = 0; i < 10; i++) { count1 = count1++; count2++; } cout

    27150

    妙招 I 只会Java,老板再也不担心我不懂区块链开发了!

    第一期Workshop实战开发只需具备Java技术基础,欢迎广大开发者、学生报名参加,名额有限,仅限80位。 演讲主题:如何用Java开发你自己的智能合约主题介绍:本次Workshop技术门槛较低,面向所有具备Java技术基础的程序员、学生。

    28420

    你真的了解 i++, ++ii+++++i 以及 i+++i++ 吗?

    本文字数:2355字 阅读本文大概需要:6 分钟我想大部分都知道 i++ 和 ++i的区别,i++ 就是先拿i来使用,之后再自增加1,而++i则是先自增加1,在拿i来使用,例如对于下面这两个语句,我敢保证大部分人都会做 不过 i++ 和 ++i 这两个操作,在内部是如何实现的呢? 所以虽然i已经等于2了,但此时栈顶的元素却是i之前的值 1 ,所以打印的是1。这下关于 i ++ 的懂了吧?那我们来看看 ++ ii ++ 的汇编指令有什么不同。 接下来我们来分析这个程序int i = 1;System.out.println(i+++i++);System.out.println(i);这里先说一下,按照运算符号的优先顺序,i+++i++等价于 (i++) + (i++)。

    33020

    你真的了解 i++, ++ii+++++i 以及 i+++i++ 吗?

    我想大部分都知道 i++ 和 ++i的区别,i++ 就是先拿i来使用,之后再自增加1,而++i则是先自增加1,在拿i来使用,例如对于下面这两个语句,我敢保证大部分人都会做:int i = 1;System.out.println 不过 i++ 和 ++i 这两个操作,在内部是如何实现的呢? 所以虽然i已经等于2了,但此时栈顶的元素却是i之前的值 1 ,所以打印的是1。这下关于 i ++ 的懂了吧?那我们来看看 ++ ii ++ 的汇编指令有什么不同。 接下来我们来分析这个程序int i = 1;System.out.println(i+++i++);System.out.println(i);这里先说一下,按照运算符号的优先顺序,i+++i++等价于 (i++) + (i++)。

    27820

    面试细节: i = i++和 i = ++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 。 (i); 结果:i = 2 }} `最后的最后:本文的思考过程和计算推导仅针对Java语言 ` 微信搜索:【Java小咖秀】更多精彩等着您~ 回复手册获取博主15万字Java面试通关手册&2万字Linux

    35300

    (i++)+(++i)+(++i)+(++j)+(j++)问题

    而这时让我想到了那蛋疼的++ -- 问题,,所以进行了一个实验,,代码如下: #include int main(){ volatile int i=0; 用volatile 修饰i volatile int j=1; 用volatile 修饰 j int sum=0; sum=(i++)+(++i)+(++i)+(++j)+(j++); std::cout

    24030

    终于弄明白 i = i++和 i = ++i

    题目package pers.mobian.questions01; public class test01 { public static void main(String args) { int i = 1; i = ++i; System.out.println(i); 结果:i = 2 }}最后的最后:本文的思考过程和计算推导仅针对Java语言最后,再附上我历时三个月总结的 Java 面试 + Java 后端技术学习指南,笔者这几年及春招的总结,github 1.4k star,拿去不谢! 后台回复「Java面试」即可获取

    14130

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

    题目package pers.mobian.questions01; public class test01 { public static void main(String args) { int i = 1; i = ++i; System.out.println(i); 结果:i = 2 }}

    12720

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

    说起这个i++, ++i 入门练习都会搞这个,一如既往,百试不爽。 表达式 a = i++; 它等价于 a = i ; i = i + 1;表达式 a = ++i 它等价于 i = i + 1; a = i;1、 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增 但是要注意其生存周期,我们要注意i值在程序流中的变化,如果是for、while循环判断中要特别注意++i的值比i++值要提前。 3、i=1 ; j=(++i)+(++i)+(++i); printf(j= %dn,j); 这个结果是什么?没有结果,因为不同的编译器做出来的结果,你要纠结这个,哎我只能说那些书上纯粹是搞人。 i += 2; 这个是 i = i + 2; 自身值加上2后赋值给自己。这个没有争议。来骚年练习一下 i += (++i)+(++i)+(++i); 呵呵!!!

    38750

    相关产品

    • 消息队列 TDMQ

      消息队列 TDMQ

      消息队列 TDMQ 是基于 Apache 顶级开源项目Pulsar自研的金融级分布式消息中间件,是一款具备跨城高一致、高可靠、高并发的分布式消息队列,拥有原生Java 、 C++、Python、GO 多种API, 支持 HTTP 协议方式接入,可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券