JAVA——算術表示式和方法引數計算
阿新 • • 發佈:2019-02-06
學過c語言的人想必對同時含有++i和i++的表示式有種說不清道不明的感覺,不同版本的c編譯器處理方式還有所不同。不過本文要說的是在java中,算術表示式的計算是怎樣進行的。
簡單地來說,就是“基於棧地、從左到右地、一邊計算一邊代入,只要當前運算子的優先順序是最高的,那麼就進行計算”。這個規則很簡單,基本上和《資料結構》裡面“算術表示式求值”的處理過程一致,執行起來也很容易。
還是舉些例子來看看吧。
res[i++]=a==(a=b)?10:20;//0==(20)?10:20int a=0; int b=20; int i=0; Integer[] res=new Integer[10]; //先給出同時存在a++和++a情況下的計算。 //雙斜槓"//"後面是幫助理解用的。 res[i++]=++a;//1 a=0; res[i++]=++a + a++;//1+1 a=0; res[i++]=++a + a++ +a;//1+1+2; a=0; res[i++]=++a + a++ +a +a;//1+1+2+2 a=0; res[i++]=++a + a++ +a +a + ++a;//1+1+2+2+3 a=0; res[i++]=++a + a++ +(a +a + ++a);//1+1+2+2+3 a=0; <pre name="code" class="java" style="font-size: 18px;">//下面這個一定要看,很多人都會弄錯的。
輸出的結果是:1, 2, 4, 6, 9, 9, 20
不過在c裡面,輸出的結果很可能是:1, 2, 3, 4, 6, 6, 10,有興趣的童鞋可以去試試。
那麼方法的引數計算又是怎麼樣的呢?
簡單地說,就是“從左向右地,挨個計算引數值,每個引數值的計算當作是一個表示式的計算”。這與c也不一樣。
我們還是來看個例子吧:
輸出的結果是:a=1, b=1, c=3<span style="white-space:pre"> </span>public static void test3_1(int a,int b,int c){ System.out.println("a="+a+", b="+b+", c="+c); } public static void test(){ int i=0; test3_1(++i, i++, ++i);//test3_1(1,1,3); }
而在c裡,輸出的結果則很可能是a=3, b=1, c=3 。有興趣的童鞋可以試一下。
本文采用的實驗環境是jdk1.7.0_21。如有錯誤,還請指正,非常感謝。