• [整理]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
    

    1. 将常量值0压入堆栈;
    2. 从堆栈中弹出值0赋值给本地变量x,此时x=0;
    3. 将本地变量x加载到堆栈中;
    4. 复制当前堆栈顶端的值,即0,(临时变量);
    5. 把常量值1压入堆栈;
    6. 堆栈顶端2个值相加,返回新的值1;
    7. 从堆栈中弹出值1赋值给本地变量x,此时x=1;
    8. 从堆栈中弹出值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++的代码,结果是不定的,结果是由编译器来决定,不同的编译器可能导致不同的结果,所以不建议写类似的代码。

    面试倒是时常遇到,所以一定要引起注意。

  • 相关阅读:
    WebApi Ajax 跨域请求解决方法(CORS实现)
    JQuery Ajax POST/GET 请求至 ASP.NET WebAPI
    Hybird APP对接后台:Net WebApi
    Chrome
    centos8平台:用fontconfig安装及管理字体(fc-list/fc-match/fc-cache)
    centos8平台:redis6配置启用io多线程(redis6.0.1)
    centos8平台安装redis6.0.1
    centos8平台:举例讲解redis6的ACL功能(redis6.0.1)
    ImageMagick实现图片加水印(ImageMagick6.9.10)
    centos8上安装ImageMagick6.9.10并压缩图片生成webp缩略图
  • 原文地址:https://www.cnblogs.com/Benoly/p/3768719.html
Copyright © 2020-2023  润新知