练习:
1.下面的代码在主方法中可以正常执行吗,如果不能,为什么?
2.已知i的值为10,请问在情况一和情况二中j的值是否相同呢?如果不相同,它们的值分别是多少呢?为什么?
3.在主方法运行这段代码后,i、j和f的值分别是多少呢?
答案:
一、
不能,因为a和b会在运行过程中转换成int类型,得出的结果自然也是int类型,所以没办法赋给byte类型的c了,必须对c的数据类型进行更改或是手动的强制转换a+b后的值,(byte)(a+b)
二、
一旦自增自减操作需要参与运算,我们就需要对其进行区分, 到底是++i(前++),还是i++(后++)。
这里的前后是指,在从变量中将数据取出后,准备放入操作数栈进行运算时,进行自增自减操作的时机的前后。
前++,JVM会在把数据放在操作数栈中之前就使其增加,增加后的值会直接进入操作数栈,参与正常的运算。
而执行后++操作时,JVM则会先把数据放在操作数栈中之后,再使其增加,因此,参与运算的还是原来的数据,此时并不会发生变化,等运算过后,再把新的值置于其中。
判断之后,我们再来分析程序:
起初,i变量中存储的是都是10
在情况一中,i++ 因为是后++,所以会先从i变量中将10取出, 放入操作数栈,然后,再对i变量中的值进行自增1,变成11,但只有操作数栈中的10才能直接参与赋值运算,11在操作数栈之外,因此j的值为10而不是11。
而在情况二中,是前++,所以我们在进入操作数栈之前就进行了自增操作,然后再进行赋值运算,因此i和j的值都为11。
三、
运行后可知,i和j结果都为11,而f的值为true。
因为是后++,所以JVM会把先i放进操作数栈中进行比较,后对其进行自增操作,因此比较时:10<11为真。又因为是或运算所以有一边为真就为真,所以f的值也就为真。比较后i自增为11,所以i的值为11。
那么为什么j的值还是11没有发生变化呢?不是有++操作吗?
因为这是一个短路或运算,只要前面的结果为真,后面表达式就不会再执行了,因此j不会发生变化。