美文网首页
i++ 和 ++i 的再思考

i++ 和 ++i 的再思考

作者: AlanGuo | 来源:发表于2016-11-11 10:15 被阅读0次

    以下是以前整理的笔记:

    作为单独的语句:
    i++;
    ++i;
    没有区别,都是自增1,相当于 i=i+1;
    ------------
    在表达式里使用,两者不同。
    表达式里,i++  就是 i,  不 自增, 先使用。退出 表达式 时 再 自增。
    表达式里,++i 就是 i=i+1,  先自增1, 再使用。退出 表达式 时 不另自增。
    例如:int i=2,a;
    a = i++;     a 为2
    a = ++i;     a 为3
    出了表达式后,打印 i, 输出为 3
    ------
    for(c=1;c<5;++c) {printf("%d",c); return 0;}   循环体里有 return 0; 所以只执行一次循环体就结束了。
    
    !!!!!!!!!!!!!!!!!!
    *但是:虽然执行结果没有区别,i++比++i更加expensive(效率低,占更多资源)。原因是:
    ++i :当程序执行到这里时,会直接把i的值增加1,然后继续进行将要进行的运算
    i++ :当程序执行到此处时,会 (1)创建一个i的copy;(2)将i自增1;(3)返回原来i的copy到原语句中,copy的值被拿来继续参与运算
    

    引发再思考的原因是想起++无论前置还是后置,优先级都比赋值=要高,那为什么 int a = i++ 之后 a 还是被赋予了i 的原值呢?

    仔细想了一下发现其实道理很简单,其实就是一个返回值的问题:

    public class Solution
    {
        public int i;
    
        public  int iPlusPlus(int i)
        {
            int iCopy = i;
            i += 1;
            this.i = i;
            return iCopy; // return original value of i
        }
    
        public int PlusPlusi(int i)
        {
            i += 1;
            this.i = i;
            return i;   // return current value of i
        }
    
        public static void main(String[] args)
        {
            Solution sol1 = new Solution();
            Solution sol2 = new Solution();
    
            int i = 1;
            int result1 = 1 + sol1.iPlusPlus(i);
            int result2 = 1 + sol2.PlusPlusi(i);
    
            System.out.println("i++: " + "result = " + result1 + "  i = " + sol1.i);
            System.out.println("++i: " + "result = " + result2 + "  i = " + sol2.i);
        }
    }
    

    运行结果:

    i++: result = 2  i = 2
    ++i: result = 3  i = 2
    

    相关文章

      网友评论

          本文标题:i++ 和 ++i 的再思考

          本文链接:https://www.haomeiwen.com/subject/cnffpttx.html