[英]Unary operator precedence in java
現在,根據這個網站, 一元后增量優先於一元預增量 。 我認為這意味着, x++
是在++x
之前完成的。
但是,當嘗試使用以下表達式時,我遇到了問題
int var1=10;
int b= --var1 + ++var1 + var1++;
現在,如果var1++
首先執行,那么根據我,
b = --var1 + ++var1 + 10
現在,如果我認為它應該在--var1
之前做++var1
,因為它提到了關聯性是從右到左 。 我想,這意味着在左邊的那些之前做正確的事情
但是,這並沒有給出正確的答案。 正確答案是29
,而我得到33
。 為什么會這樣?
我認為這意味着,
x++
是在++x
之前完成的。
不,這並不意味着。 我之前曾在博客中寫過我如何在執行順序方面找到查看優先級是有問題的。 它可能在計算機科學嚴格的方式下有效,但最終會讓人感到困惑。
我覺得更容易去想它為分組。 同樣地,我認為將關聯性視為優先級是最容易的,但對於具有相同優先級的運算符。 評估順序始終是從左到右。
所以這:
int b = --var1 + ++var1 + var1++;
分組就好像它被寫了:
int b = (--var1) + (++var1) + (var1++);
那相當於:
int b = ((--var1) + (++var1)) + (var1++);
(由於二進制+
具有從左到右的關聯性。)
那就是有效的:
int tmp1 = --var1; // tmp1 = 9, var1 = 9
int tmp2 = ++var1; // tmp2 = 10, var1 = 10
int tmp3 = tmp1 + tmp2; // tmp3 = 19
int tmp4 = var1++; // tmp4 = 10, var1 = 11
int tmp5 = tmp3 + tmp4; // tmp5 = 29
int b = tmp5; // b = 29
......這證實了你所觀察到的。
當然,你應該總是盡量避免讓代碼像這樣復雜......
要演示評估訂單部分,請考慮以下表達式:
int result = a() + b() * c();
優先級意味着分組為:
int result = a() + (b() * c());
這相當於:
// Evaluate LHS of +, which is just a()
int tmp1 = a();
// Evaluate RHS of +, which is b() * c()
// First evaluate LHS of *, which is b()
int tmp2 = b();
// Next evaluate RHS of *, which is c()
int tmp3 = c();
// Now we can evaluate *:
int tmp4 = tmp2 * tmp3;
// Now we can evaluate +:
result = tmp1 + tmp4;
在我們執行方法時,我們可以非常輕松地觀察執行順序:
public class Test {
public static void main(String[] args) throws Exception {
int result = a() + b() * c();
}
public static int a() {
System.out.println("a()");
return 3;
}
public static int b() {
System.out.println("b()");
return 4;
}
public static int c() {
System.out.println("c()");
return 5;
}
}
打印:
a()
b()
c()
...確認我的擴展中顯示的執行順序。
++ x在x ++之前完成,所以在你的例子中:b = 9 + 10 + 10 = 29 ..最后var1的值是11
總和--var1 + ++var1 + var1++
轉換為:
9 + 10 + 10
因為各種變量在處理總和時會發生變化; 很明顯,var1 ++在使用該值后遞增,而++ var在使用之前遞增。 var1的最終值為11。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.