2012-10-26 169 views
2

我寫了一個代碼來檢查C#中的類型轉換。下面的代碼:變量的值之間的差異

using System; 
class Convert{ 
    public static void Main(){ 
     double a=14.25,b=26.12; 
     var z=(int)(a*b); 
     Console.WriteLine("z= "+z); 
     Console.ReadKey(true); 
    } 
} 

都給輸出:

z=372 

但是,當我修改一下代碼,然後我得到的z較早價值之間和修改後的一個很大的區別。

using System; 
    class Convert{ 
     public static void Main(){ 
      double a=14.25,b=26.12; 
      var z=(int)a*b; // Modified part 
      Console.WriteLine("z= "+z); 
      Console.ReadKey(true); 
     } 
    } 

都給輸出:

z=365.68 

我不明白,爲什麼會出現從原始代碼去掉括號後,如此大的差別?

回答

7

沒有外括號,(int)只適用於a
因此,您最終會將正整數乘以截斷整數,並且類型推斷將var轉換爲double

使用括號,轉換適用於乘法結果。因此,整個結果被截斷,並且類型推斷將var轉換爲int


因此,改變vardouble會對任一示例中沒有任何影響。 (在第二種情況下,它將會分配截短intdouble變量)

更改varint會變成第二示例成編譯錯誤。

+0

謝謝..我明白了:) – Afaq

2

括號prioryty

var z=(int)(a*b);//(a*b) cast to int 
var z=(int)a*b;//a cast to int and myltiply with b 
0

談話操作()的優先級高於乘法的優先級設置更大。 在第一種情況下你有:

double tmp = a*b; 
int z = (int)tmp; 

和在第二:

int tmp = (int)a; 
double z = tmp * b; 
0

在線路

var z=(int)a*b; 

一個被轉換成一個int被相乘之前它。所以它會是14 * 26.12。在第二種情況下,您將乘以a * b並在之後將結果轉換爲int。