对后置++和-- 新的理解

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

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;

 

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

 

posted @ 2016-03-24 16:45  苏打兴  阅读(474)  评论(0编辑  收藏  举报