zoukankan      html  css  js  c++  java
  • 对后置++和-- 新的理解

      在跟随传智播客的视频学习后置++和--的时候:

    int age = 18;
    int sum = (age++ + 12) * 3 - 10;
    //上面这句话相当于 
    //int sum = (age + 12) * 3 - 10;
    //age++;

      然后我得出结论: 无论所在的表达式有多么复杂,都要先等表达式计算结束后,才会执行++或者--的运算。

      单看上面的代码,这个结论没有错误,先拿age的值去参与运算,然后再执行age++。之所以会得出这样的结论是因为对后置++的理解有问题。

    后置++ -- 它们的运算规则是这样的:先让变量原先的值参与运算,然后在执行++或者--。而我对这个规则的理解是:先让变量原先的值参与运算,等待整个表达式运算结束后,再执行++或者--

      因为上面的代码中,age这个变量在表达式中只出现了一次,如果age出现了多次就不是这样的结果了!!!

      所以,我对后置++ -- 执行的时机理解有错,不是要等到整个表达式运算结束,而是在变量的原值被带入表达式后,就执行了后置++或者--

      后置++ -- 常常作为笔试的考试题出现,下面我们来看2个题目。

           int a = 5;
           int b = a++ + (++a) * 2 + ++a; 
           Console.WriteLine("a = {0}", a); // 8
           Console.WriteLine("b = {0}", b); // 27

       解题时,需按照计算机的思路进行,计算机是这样理解的。就是要按照运算符的优先级来解题。如果还坚持错误的理解的话,这道题非错不可。

           int num = 5;
           int num2 = (num++ + (++num * 2)) + ++num;
           ++在后,num的值依旧为5(不是等+运算执行完后,再执行++;在num参与+运算后,就会执行++)
           num = num + 1; // 6
           num = num + 1; // 7
           执行了两次++,num = 7 (按照自己错误理解,num只会执行一次++)
           5 + 7 * 2
           num = num + 1; // 8
           num2 = 5 + 7 * 2 + 8 = 27

        第2中解法,我们可以将这个表达式拆分成几个等价的表达式。 这里c的值与 int b = a++ + (++a) * 2 + ++a;  的运算结果完全相同,x的值也是8。拆分复杂的表达式的时候,一般是按照表达式的运算顺序来分解的。        

           int x = 5;
           int c = x++;
           c = c + (++x) * 2;
           c = c + ++x;
           Console.WriteLine("x = {0}", x); // 8
           Console.WriteLine("c = {0}", c); // 27
                int a = 3;
                int b = 0, c = 0, d = 0;
                b = (a++) + (a++) + (a++); // 3 + 4 + 5 = 12 , a = 6
                c = (++a) + (++a) + (++a); // 7 + 8 + 9 = 24 , a = 9
                d = (++a) + (a++) + (++a); // 10 + 10 + 12 = 32, a = 12
                Console.WriteLine("a = {0}", a);
                Console.WriteLine("b = {0}", b);
                Console.WriteLine("c = {0}", c);
                Console.WriteLine("d = {0}", d);  

        这一题,我们就可以使用拆分法来解决,这样我们就可以看到a的值是如何变化的。

           值得注意的是后置++的优先级比前置++的优先级要高,所以 int  x = 1; int y = x +++ x;  y的值应该怎么运算呢,是 y = x + (++x)还是 y = (x++) + x呢?

        在VS中输入int y = x+++x 之后,当我们输入 ; 后,会发现,VS将表达式写成了 int y = x++ + x; 也就是说 y = (x++) + x;

        感谢 邹琼俊 同学的文章 程序员的基础和解决问题的思维很重要,我在温习的时候,及时地发现了自己过去的错误。立此博文为记录!

  • 相关阅读:
    JS 可选链操作符?. 空值合并运算符?? 详解,更精简的安全取值与默认值设置小技巧
    手写一个 Promise
    Leetcode 403 青蛙过河 DP
    Leeetcode 221 最大正方形 DP
    Leetcode 139 单词拆分
    Unity周记: 2021.07.26-08.15
    Unity周记: 2021.07.19-07.25
    Unity周记: 2020.07.12-07.18
    Unity周记: 2020.07.05-07.11
    线性规划
  • 原文地址:https://www.cnblogs.com/lcxBlog/p/5315886.html
Copyright © 2011-2022 走看看