精华内容
下载资源
问答
  • 2016-12-14 20:45:48

    git 放弃本地修改 强制更新

    git fetch --all
    git reset --hard origin/master

    git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本

    更多相关内容
  • 一看就懂的i++和++i详解

    万次阅读 多人点赞 2020-05-09 22:10:35
    我相信很多朋友可能之前已经百度过i++和++i的相关文章了,也做过不少的练习,觉得自己已经深刻掌握了它们之间的原理了,真的是这样的吗?来试试计算一下我下面提供的几道练习,你就会发现你又不会了!

    前言

    转载请说明出处,本文来自Android菜鸟:https://blog.csdn.net/android_cai_niao/article/details/106027313 QQ:2717521606

    我相信很多朋友可能之前已经百度过i++和++i的相关文章了,也做过不少的练习,觉得自己已经深刻掌握了它们之间的原理了,真的是这样的吗?来试试计算一下我下面提供的几道练习,你就会发现你又不会了!

    示例代码

    请先自己心算一下答案,然后找个本子记下来,然后再跟我后面的答案对比,看你能做对几道题,能做对两题以上的我喊你大哥!!

    示例1

    int i = 0;
    i = i++; 
    System.out.println("i = " + i); 
    

    示例2

    int a = 2; 
    int b = (3 * a++) + a;
    System.out.println(b);
    

    示例3

    int a = 2; 
    int b = a + (3 * a++);
    System.out.println(b);
    

    示例4

    int i = 1;
    int j = 1;
    int k = i++ + ++i + ++j + j++; 
    System.out.println(k);
    

    示例5

    int a = 0;
    int b = 0;
    a = a++;
    b = a++;
    System.out.println("a = " + a + ", b = " + b);
    

    示例答案

    示例1:0
    示例2:9
    示例3:8
    示例4:8
    示例5:a = 1, b = 0

    i++ 和 ++i原理

    i++ 即后加加,原理是:先自增,然后返回自增之前的值
    ++i 即前加加,原理是:先自增,然后返回自增之后的值
    重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增。
    对于++i 就不说了,大多数人都懂,而对于 i++ 的原理,我用代码模拟其原理,如下:

    int temp = i;
    i = i + 1;
    return temp;  
    

    这3句代码就是上面所说的那样:i++是先自增,然后才返回自增之前的值。

    i++字节码分析

    有很多的人写的文章上都是说i++是先返回i的值,然后再自增,这是错误,是先自增,然后再返回自增之前的值,你可能会问,这有区别吗?答:有的。只要这个没理解对,则你在计算i++的相关问题时就有可能算错。

    有的人可能又会问了,我凭什么相信你,你有什么证据证明i++是先自增,然后再返回自增之前的值吗?我还真去找过证据,我们把class的字节码搞出来,分析一下就知道了,证明如下:

    public class Test {
        void fun() {
            int i = 0;
            i = i++;
        }
    }
    
    

    如上,我们写了一个超级简单的Test类。在cmd中输入这个命令(javap -c Test.class)以查看其生成的字节码,截图如下:
    i++字节码图
    我们关注fun()方法这一段就可以了,如下:
    i++字节码图

    这就是fun()函数对应的字节码了,我们一行一行的来分析,首先我们要说两个概念,一个是变量,一个是操作栈,fun()方法中有两个变量,哎,不是只有一个变量i吗?怎么会有两个?要了解这个你需要去学习字节码的相关知识,这里我们不深究,我画图如下:
    在这里插入图片描述
    如上图,变量有两个,在位置0的变量是什么我们不要管,系统自动分配的,你要知道的是位置1的变量其实就是我们定义的变量i就行了,接下来,我们来一行行分析fun()方法对应的字节码:
    “ iconst_0 ”: i代表int类型,const代表常量,0就代表整数0,整句话的意思就是把int类型的常量0放入操作栈的栈顶中,图解如下:
    在这里插入图片描述
    “ istore_1 ”: i代表int类型,store代表存储,1代表位置为1的变量,整句话的意思就是把操作栈中栈顶的值拿走,保存到位置为1的变量上,图解如下:
    在这里插入图片描述
    “ iload_1 ”: i代表int类型,load代表加载变量的值,1代表位置为1的变量,整句话的意思就是把位置为1的变量的值加载到操作栈的栈顶中,图解如下:
    在这里插入图片描述
    “ iinc 1, 1 ” : i代表int类型,inc(increment)代表增加,这里还有两个1,前面的1代表对位置为1的变量,第2个1代表增加1,因为有i += 3这种自增操作,这种情况的话第2个数字会是3,即自增3(iinc 1, 3)。“iinc 1, 1” 整句话的意思就是把位置为1的变量的值增加1,图解如下:
    在这里插入图片描述
    注:自增操作不会改变操作栈中的值,所以变量i的值自增后变成了1,而操作栈中的值还是0。

    “ istore_1 ”: i代表int类型,store代表存储,1代表位置1的变量,整句话的意思就是:把栈顶中的值拿走,保存到位置为1的变量中,图解如下:
    在这里插入图片描述
    所以,这几行字节码合起来看,i++不就是先自增,然后才返回自增之前的值嘛!!所以大家千万别搞错顺序了。 用代码理解的话,就相当于下面的代码:

    int temp = i;
    i = i + 1;
    return temp;  
    

    最后再把++i的字节码图也贴一下,大家可以根据我上面讲解的知识分析一下,就会知道++i和i++的区别了:

    void fun() {
        int i = 0;
        i = ++i;
    }
    

    ++i字节码图

    表达式原则

    表达式有一个原则:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的

    来看一下 if 语句的其中一种结构定义:

    if (条件表达式) 语句;
    

    用这个结构写个代码,如下:

    boolean b = true;
    int i = 0;
    if(b) i++;
    

    按照上面 if 语句的结构定义,if括号中是一个表达式,但是上面代码写了一个变量b进去,这是一个变量啊,怎么也能当成一个表达式么?没错,一个变量也是表达式。

    记住这个重点:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的

    讲到这里,估计有人会对这个运算顺序和乘法这些搞混了,示例如下:

    int a = 0;
    int b = a + a * 2;
    

    如上代码,按着我的说法,一个变量也是一个表达式,“b = a + a * 2”这里a出现了两次,就是有两个a表达式,从左到右算的话先算a + a,这肯定不对啊,这不是我的意思哈,乘除法的优先级还是不能乱的,那应该先算a * 2吗?也不对,应该是这样的:因为有乘法,所以a * 2优先组成表达式,而不是a + a组成表达式,也就是说总体上可以分为两个表达式:“a” 表达式 和 “a * 2” 表达式,这两个表达式相加肯定从左到右计算嘛,先算完a表达式的结果,再算a * 2表达式的结果。你可能会想先算a和先算a * 2有区别吗?答案是:有的,看完下面 的“示例3详解” 你就清楚了。

    示例答案详解

    示例1详解

    int i = 0;
    i = i++;  
    System.out.println("i = " + i);  // 结果:0
    

    先看i++,根据原理“先自增,然后返回自增之前的值”,i 自增后,i = 1,但是接着返回自增之前的值0,此时表达式变成 i = 0,0没有赋值给 i 时 i 的值是1,但是当把0赋值给 i 时,i 的值就又变成0了。因此 i = i++ 这句代码是做无用功,因为 i 的值最终还是和原来一样。

    示例2详解

    int a = 2; 
    int b = (3 * a++) + a;
    System.out.println(b);   // 结果:9
    

    int b = (3 * a++) + a;a++后,a = 3,并返回自增之前的值2,所以此时表达式为:

    int b = (3 * 2) + a;此时a的值已经是3了,表达式又变为:

    int b = (3 * 2) + 3; 所以b = 9

    示例3详解

    int a = 2; 
    int b = a + (3 * a++);
    System.out.println(b); // 结果:8
    

    这题和示例2几乎一样啊,只是换了一下顺序而已,为什么结果就不一样了呢?这就需要用到“表达式原则 了”:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的

    int b = a + (3 * a++);按一般人的想法是先算 3 * a++,a 先自增 a=3,然后返回自增之前的值2,所以此时表达式变为:

    int b = a + (3 * 2); 此时a的值为3了,表达式又变为:

    int b = 3 + (3 * 2);结果 b = 9

    我们说一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,这个理论你可能不能深刻体会,但是如果我把代码稍微改一下你就能理解了,如下:

    int b = (a * 1) + (3 * a++) 这个代码和 int b = a + (3 * a++) 是一样的,没有区别,但是看(a *1)你就很容易的知道要先算a * 1这个表达式,表达式的结果为2。

    所以,虽然 int b = a + (3 * a++) 中前面的a只是一个变量,但他也是一个表达式,a这个表达式和(3 * a++)这个表达式进行相加,多个表达式的运算都是从左到右进行的,所以先算a这个表达式,a表达式计算结果为2,所以表达式变成:

    int b = 2 + (3 * a++) 然后是a自增并返回自增之前的值2,所以表达式又变为:

    int b = 2 + (3 * 2);所以结果为8。此时a的值为3

    示例4详解

    int i = 1;
    int j = 1;
    int k = i++ + ++i + ++j + j++;  
    System.out.println(k);  // 结果:8
    

    有了前面3条示例的详解,相信这一条大家就能自己解答了,可以先自己解答一下,看结果是不是8,不是的话,再来看我下面的讲解:

    表达式原则说多个表达式的加减法运算都是从左到右进行的,这里的表达式有:i++、++i、++j、j++,都是加法,那我们就从左到右计算这4个表达式就OK了,如下:

    1、先算i++,i++之后i的值为2,并返回++之前的值1,所以整个表达式可以变为:

       1 + ++i + ++j + j++; // 此时的i值为2

    2、再计算++i,++i之后i的值为3,并返回3,所以整个表达式可以变为:

       1 + 3 + ++j + j++; // 此时i的值为3

    3、再计算++j,++j之后j的值为2,并返回2,所以整个表达式可以变为:

       1 + 3 + 2 + j++; // 此时j的值为2

    4、再计算j++,j++之后 j的值为3,并返回2,所以整个表达式可以变为:

       1 + 3 + 2 +2; // 结果为8,此时j的值为3

    示例5详解

    int a = 0;
    int b = 0;
    a = a++;
    b = a++;
    System.out.println("a = " + a + ", b = " + b); // a = 1, b = 0
    

    到了第5题,好像已经没有难度了,大家应该都能解出来了,但是为了文章的完整性,我还是分解一下,大家应该自己先算一次,算不对再来看我的分解:

    a = a++; a++之后a的值为1,并返回0,所以a的值由1又变回了0
    b = a++; a++之后a的值为1,并返回0,0赋值给b,所以b为0,而a还是1哦!!

    总结

    • i++ 即后加加,原理是:先自增,然后返回自增之前的值
    • ++i 即前加加,原理是:先自增,然后返回自增之后的值
    • 一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
    • 真实开发中,我们不会写这些复杂的i++代码,但是为什么还要掌握这些细节呢?答:笔试,万一笔试的时候遇到这样的题目呢?回答对了就可以加分了,因为这种题很多人是答不出来的,而你回答出来了,那可是很加分的哦!
    展开全文
  • 如何理解int i=1;i=i++;

    千次阅读 2019-06-16 16:24:20
    如何理解int i=1;i=i++; 1、引入两个概念:局部变量表和操作数栈 栈帧(Stack Frame): 是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。...

    如何理解int i=1;i=i++;

    1、引入两个概念:局部变量表操作数栈

    栈帧(Stack Frame):

    是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

    每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈 都已经完全确定了,并且写入到了方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体虚拟机的实 现

    java局部变量表:

    是栈帧重要组中部分之一。他主要保存函数的参数以及局部的变量信息。局部变量表中的变量作用域是当前调用的函数。函数调用结束后,随着函数栈帧的销毁。局部变量表也会随之销毁,释放空间。

    操作数栈:

    与局部变量表一样,均以字长为单位的数组。不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问。操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区。

    存储的数据与局部变量表一致含int、long、float、double、reference、returnType,操作数栈中byte、short、char压栈前(bipush)会被转为int。

    数据运算的地方,大多数指令都在操作数栈弹栈运算,然后结果压栈。

    java虚拟机栈是方法调用和执行的空间,每个方法会封装成一个栈帧压入占中。其中里面的操作数栈用于进行运算,当前线程只有当前执行的方法才会在操作数栈中调用指令(可见java虚拟机栈的指令主要取于操作数栈)。

    2、对=赋值运算符的理解

    操作数栈弹栈赋值给局部变量表的变量

    3、理解int i=1;i=i++;

    对于int i=1;  

    局部变量表生成标识为i的变量,操作数栈将1压栈,=右边运算已结束,操作数栈将1弹栈,通过=赋值给局部变量表的i变量。

    对于i=i++;

    i还是局部变量存在的,

    i++意思是操作数栈将局部变量表i变量的值压栈,操作数栈栈顶元素是1;之后对局部变量表i变量的值自增变为2;(=右边运算已结束)最后操作数栈将栈顶元素1弹栈,通过=赋值给局部变量表的i变量,此时局部变量表变量i的值为1

    综上int i=1;i=i++;此时i=1

    补充:

    int i=1;i=++i;

    对于i=++i;

    是先对局部变量表中i变量进行自增,局部变量表中i变量的值为2;操作数栈将局部变量表i变量的值(2)压栈,操作数栈栈顶元素是2;(=右边运算已结束)最后操作数栈将栈顶元素2弹栈,通过=赋值给局部变量表的i变量,此时局部变量表变量i的值为2

    展开全文
  • 详解i++和++i,通俗易懂

    万次阅读 多人点赞 2021-01-19 19:16:31
    之前已经百度过i++和++i的相关文章了,感觉这篇写的最好理解,和大家分享一下! 示例代码 请先自己心算一下答案,然后找个本子记下来,然后再跟我后面的答案对比,看你能做对几道题,能做对两题以上的我喊你大哥!...

    前言

    之前已经百度过i++和++i的相关文章了,感觉这篇写的最好理解,和大家分享一下!

    示例代码

    请先自己心算一下答案,然后找个本子记下来,然后再跟我后面的答案对比,看你能做对几道题,能做对两题以上的我喊你大哥!!

    示例1

    int i = 0;
    i = i++; 
    System.out.println("i = " + i); 
    
     

      示例2

      int a = 2; 
      int b = (3 * a++) + a;
      System.out.println(b);
      
       

        示例3

        int a = 2; 
        int b = a + (3 * a++);
        System.out.println(b);
        
         

          示例4

          int i = 1;
          int j = 1;
          int k = i++ + ++i + ++j + j++; 
          System.out.println(k);
          
           

            示例5

            int a = 0;
            int b = 0;
            a = a++;
            b = a++;
            System.out.println("a = " + a + ", b = " + b);
            
             

              示例答案

              示例1:0
              示例2:9
              示例3:8
              示例4:8
              示例5:a = 1, b = 0

              i++ 和 ++i原理

              i++ 即后加加,原理是:先自增,然后返回自增之前的值
              ++i 即前加加,原理是:先自增,然后返回自增之后的值
              重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增。
              对于++i 就不说了,大多数人都懂,而对于 i++ 的原理,我用代码模拟其原理,如下:

              int temp = i;
              i = i + 1;
              return temp;  
              
               

                这3句代码就是上面所说的那样:i++是先自增,然后才返回自增之前的值。

                i++字节码分析

                有很多的人写的文章上都是说i++是先返回i的值,然后再自增,这是错误,是先自增,然后再返回自增之前的值,你可能会问,这有区别吗?答案:有的。只要这个没理解对,则你在计算i++的相关问题时就有可能算错。

                有的人可能又会问了,我凭什么相信你,你有什么证据证明i++是先自增,然后再返回自增之前的值吗?我还真去找过证据,我们把class的字节码搞出来,分析一下就知道了,证明如下:

                public class Test {
                    void fun() {
                        int i = 0;
                        i = i++;
                    }
                }
                

                  如上,我们写了一个超级简单的Test类。在cmd中输入这个命令(javap -c Test.class)以查看其生成的字节码,截图如下:
                  i++字节码图
                  我们关注fun()方法这一段就可以了,如下:
                  i++字节码图

                  这就是fun()函数对应的字节码了,我们一行一行的来分析,首先我们要说两个概念,一个是变量,一个是操作栈,fun()方法中有两个变量,哎,不是只有一个变量i吗?怎么会有两个?要了解这个你需要去学习字节码的相关知识,这里我们不深究,我画图如下:
                  在这里插入图片描述
                  如上图,变量有两个,在位置0的变量是什么我们不要管,系统自动分配的,你要知道的是位置1的变量其实就是我们定义的变量i就行了,接下来,我们来一行行分析fun()方法对应的字节码:
                  “ iconst_0 ” i代表int类型,const代表常量,0就代表整数0,整句话的意思就是把int类型的常量0放入操作栈的栈顶中,图解如下:
                  在这里插入图片描述
                  “ istore_1 ” i代表int类型,store代表存储,1代表位置为1的变量,整句话的意思就是把操作栈中栈顶的值拿走,保存到位置为1的变量上,图解如下:
                  在这里插入图片描述
                  “ iload_1 ” i代表int类型,load代表加载变量的值,1代表位置为1的变量,整句话的意思就是把位置为1的变量的值加载到操作栈的栈顶中,图解如下:
                  在这里插入图片描述
                  “ iinc 1, 1 ” i代表int类型,inc(increment)代表增加,这里还有两个1,前面的1代表对位置为1的变量,第2个1代表增加1,因为有i += 3这种自增操作,这种情况的话第2个数字会是3,即自增3(iinc 1, 3)。“iinc 1, 1” 整句话的意思就是把位置为1的变量的值增加1,图解如下:
                  在这里插入图片描述
                  注:自增操作不会改变操作栈中的值,所以变量i的值自增后变成了1,而操作栈中的值还是0。

                  “ istore_1 ” i代表int类型,store代表存储,1代表位置1的变量,整句话的意思就是:把栈顶中的值拿走,保存到位置为1的变量中,图解如下:
                  在这里插入图片描述
                  所以,这几行字节码合起来看,i++不就是先自增,然后才返回自增之前的值嘛!!所以大家千万别搞错顺序了。 用代码理解的话,就相当于下面的代码:

                  int temp = i;
                  i = i + 1;
                  return temp;  
                  
                   

                    最后再把++i的字节码图也贴一下,大家可以根据我上面讲解的知识分析一下,就会知道++i和i++的区别了:

                    void fun() {
                        int i = 0;
                        i = ++i;
                    }
                    
                     

                      ++i字节码图

                      表达式原则

                      表达式有一个原则:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的

                      来看一下 if 语句的其中一种结构定义:

                      if (条件表达式) 语句;
                      
                       

                        用这个结构写个代码,如下:

                        boolean b = true;
                        int i = 0;
                        if(b) i++;
                        
                         

                          按照上面 if 语句的结构定义,if括号中是一个表达式,但是上面代码写了一个变量b进去,这是一个变量啊,怎么也能当成一个表达式么?没错,一个变量也是表达式。

                          记住这个重点:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的

                          讲到这里,估计有人会对这个运算顺序和乘法这些搞混了,示例如下:

                          int a = 0;
                          int b = a + a * 2;
                          
                           

                            如上代码,按着我的说法,一个变量也是一个表达式,“b = a + a * 2”这里a出现了两次,就是有两个a表达式,从左到右算的话先算a + a,这肯定不对啊,这不是我的意思哈,乘除法的优先级还是不能乱的,那应该先算a * 2吗?也不对,应该是这样的:因为有乘法,所以a * 2优先组成表达式,而不是a + a组成表达式,也就是说总体上可以分为两个表达式:“a” 表达式 和 “a * 2” 表达式,这两个表达式相加肯定从左到右计算嘛,先算完a表达式的结果,再算a * 2表达式的结果。你可能会想先算a和先算a * 2有区别吗?答案是:有的,看完下面 的“示例3详解” 你就清楚了。

                            示例答案详解

                            示例1详解

                            int i = 0;
                            i = i++;  
                            System.out.println("i = " + i);  // 结果:0
                            
                             

                              先看i++,根据原理“先自增,然后返回自增之前的值”,i 自增后,i = 1,但是接着返回自增之前的值0,此时表达式变成 i = 0,0没有赋值给 i 时 i 的值是1,但是当把0赋值给 i 时,i 的值就又变成0了。因此 i = i++ 这句代码是做无用功,因为 i 的值最终还是和原来一样。

                              示例2详解

                              int a = 2; 
                              int b = (3 * a++) + a;
                              System.out.println(b);   // 结果:9
                              
                               

                                int b = (3 * a++) + a;a++后,a = 3,并返回自增之前的值2,所以此时表达式为:

                                int b = (3 * 2) + a;此时a的值已经是3了,表达式又变为:

                                int b = (3 * 2) + 3; 所以b = 9

                                示例3详解

                                int a = 2; 
                                int b = a + (3 * a++);
                                System.out.println(b); // 结果:8
                                
                                 

                                  这题和示例2几乎一样啊,只是换了一下顺序而已,为什么结果就不一样了呢?这就需要用到“表达式原则 了”:一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的

                                  int b = a + (3 * a++);按一般人的想法是先算 3 * a++,a 先自增 a=3,然后返回自增之前的值2,所以此时表达式变为:

                                  int b = a + (3 * 2); 此时a的值为3了,表达式又变为:

                                  int b = 3 + (3 * 2);结果 b = 9

                                  我们说一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的,这个理论你可能不能深刻体会,但是如果我把代码稍微改一下你就能理解了,如下:

                                  int b = (a * 1) + (3 * a++) 这个代码和 int b = a + (3 * a++) 是一样的,没有区别,但是看(a *1)你就很容易的知道要先算a * 1这个表达式,表达式的结果为2。

                                  所以,虽然 int b = a + (3 * a++) 中前面的a只是一个变量,但他也是一个表达式,a这个表达式和(3 * a++)这个表达式进行相加,多个表达式的运算都是从左到右进行的,所以先算a这个表达式,a表达式计算结果为2,所以表达式变成:

                                  int b = 2 + (3 * a++) 然后是a自增并返回自增之前的值2,所以表达式又变为:

                                  int b = 2 + (3 * 2);所以结果为8。此时a的值为3

                                  示例4详解

                                  int i = 1;
                                  int j = 1;
                                  int k = i++ + ++i + ++j + j++;  
                                  System.out.println(k);  // 结果:8
                                  
                                   

                                    有了前面3条示例的详解,相信这一条大家就能自己解答了,可以先自己解答一下,看结果是不是8,不是的话,再来看我下面的讲解:

                                    表达式原则说多个表达式的加减法运算都是从左到右进行的,这里的表达式有:i++、++i、++j、j++,都是加法,那我们就从左到右计算这4个表达式就OK了,如下:

                                    1、先算i++,i++之后i的值为2,并返回++之前的值1,所以整个表达式可以变为:

                                       1 + ++i + ++j + j++; // 此时的i值为2

                                    2、再计算++i,++i之后i的值为3,并返回3,所以整个表达式可以变为:

                                       1 + 3 + ++j + j++; // 此时i的值为3

                                    3、再计算++j,++j之后j的值为2,并返回2,所以整个表达式可以变为:

                                       1 + 3 + 2 + j++; // 此时j的值为2

                                    4、再计算j++,j++之后 j的值为3,并返回2,所以整个表达式可以变为:

                                       1 + 3 + 2 +2; // 结果为8,此时j的值为3

                                    示例5详解

                                    int a = 0;
                                    int b = 0;
                                    a = a++;
                                    b = a++;
                                    System.out.println("a = " + a + ", b = " + b); // a = 1, b = 0
                                    
                                     

                                      到了第5题,好像已经没有难度了,大家应该都能解出来了,但是为了文章的完整性,我还是分解一下,大家应该自己先算一次,算不对再来看我的分解:

                                      a = a++; a++之后a的值为1,并返回0,所以a的值由1又变回了0
                                      b = a++; a++之后a的值为1,并返回0,0赋值给b,所以b为0,而a还是1哦!!

                                      总结

                                      • i++ 即后加加,原理是:先自增,然后返回自增之前的值
                                      • ++i 即前加加,原理是:先自增,然后返回自增之后的值
                                      • 一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
                                      • 真实开发中,我们不会写这些复杂的i++代码,但是为什么还要掌握这些细节呢?答:笔试,万一笔试的时候遇到这样的题目呢?回答对了就可以加分了,因为这种题很多人是答不出来的,而你回答出来了,那可是很加分的哦!

                                      转载自https://blog.csdn.net/android_cai_niao/article/details/106027313

                                      展开全文
                                    • STM32 HAL库 硬件I2C 从机主机防BUG程序

                                      千次阅读 多人点赞 2020-05-24 02:23:31
                                      前言 最近死磕了5天的STM32F1硬件I2C从机的程序,天天早上8点到凌晨,几乎全程心流状态。终于在结合各方资料即自己的...要问的兼容性有多强,连I2C bug都能做到一样,哈哈。我当初用GD想着硬件I2C应该能舒服用了,万
                                    • i 标签设置背景图片作 icon的问题

                                      千次阅读 2019-07-28 21:25:29
                                      写了一个 i 标签它设置了宽高和背景图片,但是界面不显示,且宽高依然是0 .icon-name { background: url("../../img/username.png"); width: 40px; height: 35px; } **1、因为 i 标签是行内标签,它不可以...
                                    • Python学习之 i += 3 与 i = i +3

                                      千次阅读 2018-09-06 18:13:07
                                      详解Python中表达式i += x与i = i + x是否等价,python表达式 最近看到一个题目,看似很简单,其实里面有很深的意义,题目是Python 表达式 i += x 与 i = i + x 等价吗?如果你的回答是yes,那么恭喜你正确了50%,...
                                    • [总线]I2C通信

                                      千次阅读 2018-11-14 10:14:56
                                      I2C总线 SCL:时钟 SDA:数据 接线 主设备和从设备 SDA脚——SDA脚 SCL脚——SCL脚 传输数据 I2C有设备地址 开始:SCL为高电平时,SDA由高电平向低电平跳变(下降沿) 结束:SCL为高电平时,SDA由低...
                                    • 串口通信————UART、I2C、SPI详解(总结篇)

                                      千次阅读 多人点赞 2022-01-04 09:55:57
                                      UART、I2C、SPI 串口通信工作原理、传输步骤详解,串行与并行,全双工与半双工,异步方式与同步方式
                                    • 我同学有简单地告诉我,i++的话要先copy出一个i然后赋值,用原来的i继续其他运算,最后再把copy出来的i做个increment,然后返还原来的i。 而++i直接在原来的i上做increment。 结论:当n很大的时候,++i速度比i++...
                                    • SMBus与I2C的区别

                                      万次阅读 2017-07-24 15:08:41
                                      【转】SMBus与I2C的区别 SMbus 最早是由 Intel 公司提出来的。现在由 SBS 管理维护这一个规格。 此规格是用 Philips 的 I2C 简化而来。 SMbus 是由两条信号线组成。用于在系统上较慢速的设备及电源管理设备之间的...
                                    • 一、问题描述 fun = [lambda x: x*i for i in range(4)] for item in fun: print(item(1)) 上述式子的输出结果: 预计结果为:0, 2, 4, 6 实际输出为:3, 3, 3, 3 原理:i 在外层作用域 lambd...
                                    • 从我们学习C语言开始一直到C++,++ii++一直是我们每天在使用的,他们一个是前增量,一个是后增量,他们的区别到底有多大? 我们来看看下面的两种操作结果: 当我们执行如下代码时: #include<stdio.h> int ...
                                    •  TI的FPDLINK芯片充分利用了这个特性,并不是把接收到的i2c波形进行简单的转发(即保持和发送端相同的波特率),而是将收到的数据重新再按照FPDLINK芯片上设置的波特率重新发送。因此在分析FPDLINK Slave端i2c ...
                                    • 首先I2C和SMBus是兼容的,亲测把初始化换成SMBus或者I2C都是可以通信的。... 反正既然说了就搞呗,结果发现网上关于I2C用从机中断的资料巨少,就想着把代码po上来共享一下。#include "II...
                                    • 单链表的删除第i个元素

                                      千次阅读 2019-08-28 18:11:13
                                      a2的节点q,要实现q的删除,就是让的前继节点p绕过a2直接指向后继节点a3。 p->next=p->next->next; 单链表第i个数据删除结点的算法思路: 1.声明结点p指向链表第一个结点,初始化j=1; 2.当j<i时,就...
                                    • esp32 在arduino1.8下的I2C引脚

                                      万次阅读 多人点赞 2018-08-07 16:28:13
                                      写的很叙事 ...恐惧:恐惧是C++的,我这几天正好在网上看到别人说,C++语法可以特别特别恶心,常量特别特别难定位。我就在想有多难,有多恶心,CTRL+f很快就定位到了。然后这几天头头在捣鼓传感器,我...
                                    • I2C SDA SCL被拉低问题分析

                                      千次阅读 2020-08-11 12:18:59
                                      描述一下I2C最重要的几个特性,为了后面描述问题和解决方案作一些铺垫。 I2C是由两根线(时钟SCL + 数据SDA)组成的多主多从串行同步通信总线。 规范要求接入I2C的器件,SCL时钟和SDA数据线都必须是双向开漏结构的...
                                    • C语言 表白代码( love you!)

                                      万次阅读 多人点赞 2019-10-11 18:00:18
                                      i++) printf("%d+%d=%c%c\t",i,i+2,i,i+2); printf("\n"); return 0; } #include int main(void) { char s[]="啊";//汉字在C/C++中是用2个字节表示的,而对应的ASCII码则是两个负数。 char m[3]; printf("%d %d\n...
                                    • i=i++的问题

                                      万次阅读 2017-08-06 22:04:52
                                      public class Test { public static void main(String[] args) { int i = 1; i = i++; System.out.println(i);...按照我最初的想法,输出应该是2,因为把i赋值给i相当于没做什么操作,然后对i进行自
                                    • I/O复用的理解

                                      千次阅读 多人点赞 2018-05-12 00:31:27
                                      I/O复用就是单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流.假设你是一个机场的空管, 你需要管理到你机场的所有的航线, 包括进港,出港, 有些航班需要放到停机坪等待,有些航班需要去登机口接...
                                    • i2c_transfer函数

                                      万次阅读 2015-12-09 15:29:10
                                      i2c_transfer函数 i2c_transfer函数 i2c_transfer()函数本身不具备驱动适配器物理硬件完成消息交互的能力,它只是寻找到i2c_adapter对应的i2c_algorithm,并使用i2c_algorithm的master_xfer()函数真正驱动硬件流程...
                                    • 一 、I2C物理层 I2C 通讯设备之间的常用连接方式见图: 有以下特点:(参考数据手册:上拉电阻一般4.7k~10k ,一般4.7k) (1)由两条总线控制:一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示...
                                    • RISC-V RV32I 基本6种指令集

                                      千次阅读 多人点赞 2020-04-14 12:49:01
                                      RISC-V 的RV32I是最基本的指令集,包括6种。 其中最基本的是R I S U。 R type
                                    • STM32F030 硬件I2C驱动 AT24C16

                                      千次阅读 2016-10-21 20:17:33
                                      由于F0完全重写了I2C,所以以往的代码并不能直接使用,修改事件、接口上会浪费很多时间,特别是对于使用F0系列进行入门的新手。 在此十分感谢 畅学电子网 的对于AT24C16的资料,特别是AT24C16地址的解释。调试过程...
                                    • KeyClone v1.9i中文免费版

                                      千次下载 热门讨论 2011-07-05 21:03:18
                                      KeyClone v1.9i中文版(只有广告!没毒才是硬道理) 这个Keyclone的功能是比AutoHotKey要来的强,而且更简单。所以我还是要向大家推荐,并且大家一些简单的教程,好让大家快速上手。 首先下载破解版本免安装的,...
                                    • //功能:获取第i个结点元素 Status GetElemt_L(LinkList L,int i,ElemType *e); //功能:链表根据优先级插入元素 Status ListInsert_L(LinkList L,ElemType e); //功能:链表删除头结点 Status ListDelete_L...
                                    • 2、俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。 作者简洁 作者:大家好,我是帅地,从大学、自学一路走来,深知算法,计算机基础知识的重要性,所以申请了一个微星公众号『帅地玩编程』,专业...
                                    • 空间统计:Moran's I(莫兰指数)

                                      万次阅读 多人点赞 2018-03-10 16:22:07
                                      前两天聊了空间统计学里面的两个经典概念,今天来说说第一篇文章留下的大坑:Moran’s I。 首先,Moran’s I这个东西,官方叫做:莫兰指数,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick ...
                                    • 我花了一夜用数据结构女朋友写个H5走迷宫游戏

                                      万次阅读 多人点赞 2019-09-10 23:27:18
                                      ),写个猜数字游戏,问加减乘除等于几。 超越妹妹又不是小孩子,糊弄不过去。 经过一番折腾,终于在半夜12点确定写 迷宫小游戏 了。大概弄清楚其中的几个步骤。 大概是 : 画线—>画迷宫(擦线)—>...

                                    空空如也

                                    空空如也

                                    1 2 3 4 5 ... 20
                                    收藏数 926,476
                                    精华内容 370,590
                                    关键字:

                                    给i他