展开

关键词

java中 i = i++和 j = i++ 的区别

由于i++和i--的使用会导致值的改变,所以在处理后置的++和--的时候,java的编译器会重新为变量分配一块新的内存空间,用来存放原来的值, 而完成赋值运算之后,这块内存会被释放。 (1)对于j = i++的情况 ?    i的原始值存放在后开辟的内存中,最后将这个值赋给j,进行j = i++运算之后,j会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到的值分别是:j(此时的值等于初始i的值)和i (2)对于i = i++的情况 ? 总结:  Java编译器每次遇到自增(指的是i++)、自减(指的是i--)运算符的时候都会开辟一块新的内存空间来保存赋值之前j的值,即为缓存变量,然后再将这个换成变量的值赋给左边的变量。

531100

a = i++ 到底对不对?

编程中有时会遇到一些有歧义的表达式,比如 a[i] = i++ 。那么 a[i] = i++ 到底对不对呢? 首先请看如下代码: #include<stdio.h> int main(){ int i=0; int a[3] = {1,2,3}; a[i] = i++; printf("%d \ n",a[i]); printf("%d %d %d ",a[0],a[1],a[2]); return 0; } 对于这个表达式中 a[i] = i++,子表达式i++有一个副作用,它会改变 未定义行为的其他示例包括访问超出其边界的数组, 解除引用空指针, 在生命终结后访问对象 或写作 据称聪明的表达 喜欢 i++ + ++i。 因此我们在编写代码时最好避免 a[i] = i++ 这种C语言未定义的写法。

35731
  • 广告
    关闭

    腾讯云+社区系列公开课上线啦!

    Vite学习指南,基于腾讯云Webify部署项目。

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

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

    volatile int i=0; //用volatile 修饰i volatile int j=1; // 用volatile 修饰 j int sum=0; sum=(i+

    27930

    java中i=i++问题分析

    程序的执行顺序是这样的:因为++在后面,所以先使用i,“使用”的含义就是i++这个表达式的值是0,但是并没有做赋值操作,它在整个语句的最后才做赋值,也就是说在做了++操作后再赋值的,所以最终结果还是0

    19430

    java中i=i++问题分析

    程序的执行顺序是这样的:因为++在后面,所以先使用i,“使用”的含义就是i++这个表达式的值是0,但是并没有做赋值操作,它在整个语句的最后才做赋值,也就是说在做了++操作后再赋值的,所以最终结果还是0

    19610

    快看,i++真的不安全

    上期文章讲到“i++;”本身是一个线程不安全的操作,原因是操作不是原子性的,存在取值和赋值的两个过程,但是究竟怎么会不安全呢?本期借助一个“vmlens”的项目来演示为何会发生线程不安全的情况。 : public class TestCounter { private volatile int i = 0; @Interleave public void increment() { i+ 从图中我们可以看出在两个线程同时执行“i++;”的时候,两个线程都先后读取到了i的值“0”,然后先后完成了计算“i+1”,最后又先后给i赋值“1”,导致测试用例执行失败。

    25530

    面试细节: i = i++和 i = ++i

    public class test01 { public static void main(String[] args) { int i = 1; i = i+ +; int j = i++; int k = i + ++i * i++; System.out.println("i="+i); System.out.println 此题目我们只需要用到栈帧里面的局部变量表和操作数栈 2.1、第一步 int i = 1 [07fb0f1c-2013-4ca1-9de3-63693a07aa4f.png] 只是一个简单的赋值操作 2.2、第二步 i = i+ ] `结果:i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1 ` 2.4、第四步 int k = i + ++i * i++ [6798b125 // 结果:i = 2 } } `最后的最后:本文的思考过程和计算推导仅针对Java语言 ` 微信搜索:【Java小咖秀】更多精彩等着您~ 回复手册获取博主15万字Java面试通关手册&2万字Linux

    55300

    java中i++ 和 ++i的区别

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

    45130

    i++ 和 ++i 有什么区别

    问题 C 语言中, i++ 和 ++i 有什么区别?在 for 语句中应该用哪个? 回答 ++i 先使 i 先自加一,然后返回 i, i = 1; j = ++i; (i is 2, j is 2) i++ 先返回 i,再使 i 自加一, i = 1; j = i++; (i is 2 如果 i 是一个基本类型(short/int/…)的话,++i 和 i++ 其实没什么区别。

    9820

    你可能对 sizeof(i++) 有点误解。。。

    include<stdio.h> int main() { int i; i = 8; printf("%d\n",i); printf("%d\n",sizeof(i+ 根据C99的规范,sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义,所以sizeof(i++)在编译的时候被翻译成sizeof((i++的数据类型)),也就是4(32位int),换言之编译时 sizeof(i++)就被4取代了! 因此当程序最终执行的时候,sizeof里面不会有任何的i++运算,所以i的值是不变的,这就是本题想考察的点了。

    58810

    For循环中,只能`i++`或者`++i`吗?

    但是我想一次性+2,而i++只能累加1,于是我改成了这样。 因为i++,是有自加功能的,它的含义是i=i+1的缩写,它有两层含义,一是i+1,二是把得到的值再复赋值给i。 而单纯一个i+1没有赋值功能,加完以后,i的值还是原值,加上1,毫无意义。 总之,不管出不出现错误提示,你写成i+1或者是sum+1毫无用处,也不会起到任何作用,它不能代替i++,或者sum++。 i++不是单纯+1,他存在了一个过程,i = i + 1,而这样就不是直接赋值。 至于为什么i + 2不行,因为他是一步到位,循环中这样i的值是没有任何变化的!

    5310

    从字节码角度解释i++和++i

    @Test public void test2(){ int i = 10; i = i++; System.out.println(i);

    13720

    为什么说++i的效率比i++高?

    来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com 前言 不知道你是否听说过++i比i++快的说法,真的如此吗? ++i与i++的区别 这两个表达式从我们初学编程语言的时候就会接触到。前者是自增后取值,后者是取值后自增。 我们看一个简单的例子。 void test() { int i = 0; i++; //++i; } 汇编: push rbp mov rbp, rsp mov DWORD PTR [rbp

    51020

    从volatile说到i++的线程安全问题

    =>42,当然使用volatile的同时也会增加性能开销 注意 volatile并不能保证非源自性操作的多线程安全问题得到解决,volatile解决的是多线程间共享变量的「可见性」问题,而例如多线程的i+ +,++i,依然还是会存在多线程问题,它是无法解决了.如下:使用一个线程i++,另一个i--,最终得到的结果不为0 public class VolatileTest { private static // new DecThread().run(); System.out.println("Start thread: " + Thread.currentThread() + " i+ +和++i并非原子操作,我们若查看字节码,会发现 void f1() { i++; } 的字节码如下 void f1(); Code: 0: aload_0 1: dup 2: getfield #2 ; //Field i:I 5: iconst_1 6: iadd 7: putfield #2; //Field i:I 10: return 可见i++执行了多部操作, 从变量i中读取读取i的值

    16120

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

    说起这个i++, ++i 入门练习都会搞这个,一如既往,百试不爽。 表达式 a = i++; 它等价于 a = i ; i = i + 1; 表达式 a = ++i 它等价于 i = i + 1; a = i; 1、 首先两者的区别是:前者是先赋值,然后再自增; 后者是先自增,后赋值 2、 ++i 和i++ 的使用,一般来说在循环域里面,这两者并没有什么很大的区别,因为编译器一般都会给你做优化。 但是要注意其生存周期,我们要注意i值在程序流中的变化,如果是for、while循环判断中要特别注意++i的值比i++值要提前。

    41150

    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

    41500

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

    本文在JVM指令层次讲解i=i++之后,i的值不变的问题。. Local Variable index value 0 … … n x … ISTORE n 执行后Local Variable index value 0 … … n x + 1 … i+ + VS ++i 在平时的讲解中,”i++“ 这条指定会在完成整个语句运算后执行,”++i“ 这条指令会在整个语句运算前执行。 实例讲解 i=i++ 现在有一段代码如下 public void afterPlus() { int i = 0; i = i++; Assert.assertEquals(0 public void beforePlus() { int i = 0; i = ++i; Assert.assertEquals(1, i); } } 编译成指令后,其中i=i+

    18010

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

    public class test01 { public static void main(String[] args) { int i = 1; i = i+ +; int j = i++; int k = i + ++i * i++; System.out.println("i="+i); System.out.println 只是一个简单的赋值操作 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++ ?

    20830

    从volatile说到i++的线程安全问题

    注意 volatile并不能保证非源自性操作的多线程安全问题得到解决,volatile解决的是多线程间共享变量的可见性问题,而例如多线程的i++,++i,依然还是会存在多线程问题,它是无法解决了.如下: 使用一个线程i++,另一个i--,最终得到的结果不为0。 // new DecThread().run(); System.out.println("Start thread: " + Thread.currentThread() + " i+ +和++i并非原子操作,我们若查看字节码,会发现: void f1() { i++; } 的字节码如下: void f1(); Code: 0: aload_0 1: dup 2: getfield #2; //Field i:I 5: iconst_1 6: iadd 7: putfield #2; //Field i:I 10: return 可见i++执行了多部操作, 从变量i中读取读取i的值

    15520

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

    先看一段代码: int i = 0; int a = i++; sout("a的值是:"+i); sout("i的值是:"+i); 最终的编译之后的核心字节码如下 L0 BITPUSH 0 //将常量 中 L3 ILOAD_2 //从局部变量表的第二个slot槽中,取出该值,压入操作栈顶 IRETURN //返回栈顶元素 最终的输出的结果为: a的值是: 1 i的值是: 1; 总结 i+ + 和 ++i 在理论上的区别是 : i++:是先把i拿出来使用,然后再+1; ++i :是先把i+1,然后再拿出来使用;

    5020

    相关产品

    • TencentOS Server

      TencentOS Server

      腾讯服务器操作系统(TencentOS Server,TS)是腾讯云推出的Linux操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云CVM全规格实例上,包括黑石2.0服务器。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券