能把下面的三句代码等效拆分写下吗?实参自增的时机跟我想的有点不一样啊。
( 忽略下方法的参数类型和返回值类型 )
//statement 1
int i=0;
method1(i, method2(i, method3( i++ )));
//statement 3
i = 0;
method1(i, method2(i++, method3( i )));
//statement 2
i = 0;
method1(i++, method2(i, method3( i )));
比如第一条语句,我以为是等效于:
Object result3 = method3(i);
i++;
Object result2 = method2(i, result3);
method3(i, result2);
但好像不是。
以第一个为例吧,其它几个其实都是类似的
int i=0;
method1(i, method2(i, method3( i++ )));
第一句定义变量i,并赋值0
第二句其实简单理解,就是执行method1,该方法需要两个参数,i和method2(i,method3(i++))的返回值,要执行method1,先要执行method2(i,method3(i++))获取到返回值;而method2(i,method3(i++))也需要两个参数,同理,要执行method2(i,method3(i++))需要优先执行method3(i++)获取到返回值,这里需要注意,执行method3方法时,传入的参数应该是0,因为i++是先赋值,后自增。
再往回推
method1 和 method2 的i是先取参数的
Object result3 = method3(i);
Object result2 = method2(i, result3);
method1(i, result2);
i++;
2
i=0
method1(0, method2(0, method3( 1 )));
3
i=0
method1(0, method2(1, method3( 1 )));
java的参数是引用,然后执行是根据方法栈执行的
参数是按顺序进栈的
int i=0;
method1(i, method2(i, method3( i++ )));
method1第一个参数是i,就是0,不管你后面把i变成多少,此时i的引用就是0
同理method2第一个参数是i,就是0
method3的参数是i的自增前艾希射日 的数,也是0,如果用++i就是1
执行完后i是1
//statement 3
i = 0;
method1(i, method2(i++, method3( i )));
method1第一个参数是i,就是0,不管你后面把i变成多少,此时i的引用就是0
同理method2第一个参数是i自增前的数,就是0,执行完后i是1
method3的参数是i,是1
//statement 2
i = 0;
method1(i++, method2(i, method3( i )));
method1第一个参数是i自增前的数,就是0,执行完后i是1
同理method2第一个参数i是1
method3的参数是i,是1
i++呀,当前行代码全部执行完后++