首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 賦值表達式求值順序與 C 語言差異:左到右 vs 右到左導致結果不同

     編輯:程式設計綜合問答

表達式 a += a -= a * a,初始 a=2。C 語言結果 -4,Java 結果 0。根因:Java 按左到右求值操作數,C 編譯器實現多為右到左或未定義行為。

Java 求值過程

a = 2
1. 計算左邊 a (值 2)           → 臨時保存 left=2
2. 計算右邊 a -= a * a
   2.1 計算右邊 a * a = 4
   2.2 a = a - 4 = -2            → a 變為 -2,表達式值 -2
3. left += (-2) = 0             → a 最終為 0

C 語言典型行為

1. 先算右邊 a -= a * a
   a = 2 - 4 = -2
2. 左邊 a += (-2) 此時 a 已為 -2
   -2 + (-2) = -4

標準規定

  • JLS 15.7:操作數求值順序**嚴格左到右**
  • C 標準:複合賦值求值順序**未指定**,不同編譯器結果不同
  • 最佳實踐:避免在同一表達式中多次修改同一變量,拆分語句消除歧義

驗證代碼

// Java
int a = 2;
a += a -= a * a;
System.out.println(a); // 0

// 等價拆分
int a = 2;
int temp = a - a * a; // -2
a = temp;             // -2
a = a + temp;         // 0
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved