fun(++i, i, i++, i++)问题

这是几个月前一个学弟问我的问题,应该是c2级上的一个选择题,还是蛮有意思的,而且网上是没有这个题的答案的,题目是这样的

public class Demo{
  public static void fun(a,b,c,d){
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
    System.out.println(d);
  }
  public static void main(String[] args){
   int i=1;
   fun(++1,i,i++,i++);
  }
}

输出结果是:4,4,2,1 肯定想不到吧。计算步骤如下:

首先是明确2个问题
1.函数的执行顺序为从右到左执行
2.参数计算结果后并不会马上返回计算结果,而是等所有值都计算以后再返回结果。

如第一题:
fun(++i, i, i++, i++)
//-------------------------------------------计算阶段---------------------------------------------------

1).i++; (当时i=1)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第四个参数d=1
2).i++;	(当时i=2)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第三个参数c=2
3).i;	(当时i=3)	由于是i 所以不会记录到内存中 最后会直接返回i值
4).++i;	(当时i=4)	由于是++i 程序会在i的基础上+1 并返回i值 所以不会记录到内存中 最后会直接返回i值

//-------------------------------------------返回计算结果阶段---------------------------------------------------

5).返回第四个参数	返回1)中内存地址中的值 d=1
6).返回第三个参数	返回2)中内存地址中的值 c=2
7).返回第二个参数	返回i值 b=4
8).返回第一个参数	返回i值 a=4

不过他还有一道衍生题main函数中调用fun函数中传递的参数变成这样:fun(++i, i++, i++, ++i);

解题思路如下:

第二题:
fun(++i, i++, i++, ++i);
//-------------------------------------------计算阶段---------------------------------------------------

1).++i; (当时i=2)	由于是++i 程序会在i的基础上+1 并返回i值 所以不会记录到内存中 最后会直接返回i值
2).i++;	(当时i=2)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第三个参数c=2
3).i++;	(当时i=3)	由于是i++ 所以会将该值保存到内存中 最后会返回该内存中的值 第三个参数b=3
4).++i;	(当时i=5)	由于是++i 程序会在i的基础上+1 并返回i值 所以不会记录到内存中 最后会直接返回i值

//-------------------------------------------返回计算结果阶段---------------------------------------------------

5).返回第四个参数	返回i值 d=5
6).返回第三个参数	返回2)中内存地址中的值 c=2
7).返回第二个参数	返回3)中内存地址中的值 b=3
8).返回第一个参数	返回i值 a=5

虽然实例是用java写的,实际运行环境其实是c++,至于为啥。因为vs有反汇编啊。这题单步跟踪调试绝对一头雾水,反汇编反而一目了然。

时间: 2024-10-06 18:35:37