1. 程式人生 > >JAVA——算術表示式和方法引數計算

JAVA——算術表示式和方法引數計算

學過c語言的人想必對同時含有++i和i++的表示式有種說不清道不明的感覺,不同版本的c編譯器處理方式還有所不同。不過本文要說的是在java中,算術表示式的計算是怎樣進行的。

簡單地來說,就是基於棧地、從左到右地、一邊計算一邊代入,只要當前運算子的優先順序是最高的,那麼就進行計算。這個規則很簡單,基本上和《資料結構》裡面算術表示式求值的處理過程一致,執行起來也很容易

還是舉些例子來看看吧。

int 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;">//下面這個一定要看,很多人都會弄錯的。
res[i++]=a==(a=b)?10:20;//0==(20)?10:20

輸出的結果是:1, 2, 4, 6, 9, 9, 20

不過在c裡面,輸出的結果很可能是:1, 2, 3, 4, 6, 6, 10,有興趣的童鞋可以去試試。

那麼方法的引數計算又是怎麼樣的呢?

簡單地說,就是從左向右地,挨個計算引數值,每個引數值的計算當作是一個表示式的計算。這與c也不一樣。

我們還是來看個例子吧:

<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);
	}
輸出的結果是:a=1, b=1, c=3
而在c裡,輸出的結果則很可能是a=3, b=1, c=3 。有興趣的童鞋可以試一下。

本文采用的實驗環境是jdk1.7.0_21。如有錯誤,還請指正,非常感謝。得意