• i++


    先看这么一段代码:

     本来以为都会输出2,结果第一个输出是1,这是为啥呢?

    还得先看下边这种情况:

     下边的输出也是1,先看一下字节码:

     流程大致如下:

     把0压入栈顶->0弹出赋值给i->0再压入栈顶->局部变量i+1,现在局部变量里的i是1了->0弹出赋值给i(这个时候i的值又被修改了)

    所以最后输出i的时候还是原来的值,其实就是多了一步而已,所以在这里i++就是给局部变量+1的过程,而i=i+1是把栈顶元素重新赋值的过程,所以打印出来的i是不对的。

    然后看一下第一种情况:

     可以看到,虽然把i放进方法区,而且并没有给i++赋值,但是还是大同小异:

    当输出i++这个整体的时候还是被重新赋值了,但是被赋值的这个变量在main方法的局部变量表中不可见,因为没定义,但是因为i是静态变量,i++这个操作还是成功的

    因此在打印静态变量的值会发现i的值正确了。

    其实就是注意i++的操作在这里可以理解为是发生在局部变量表中的(其实在这里是4步:入栈,出栈赋值,+1操作,赋值),而i=这个操作是栈顶元素赋值的操作,两者独立。

    结论:i++后已经是赋值完成了,i=i+1,是把栈顶元素重新赋值了一遍。

    我不是程序员,我只是程序的搬运工
  • 相关阅读:
    【BNUOJ 4358】 左手定则
    【NOIP】关押罪犯
    【数算A】表达式·表达式树·表达式求值
    【POJ1679】The Unique MST
    【数算A】舰队、海域出击!
    【NOI2014】动物园
    【POJ1308】&&【HDU1272】Is It A Tree && 小希的迷宫
    【NOI2002】银河英雄传说
    html5之本地存储localStorage示例
    html5之应用缓存示例
  • 原文地址:https://www.cnblogs.com/keith0/p/12851024.html
Copyright © 2020-2023  润新知