这是几个月前一个学弟问我的问题,应该是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