C# 变量值之间的差异

C# 变量值之间的差异,c#,casting,C#,Casting,我写了一个代码来检查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=365.68 但是当我稍微修改代

我写了一个代码来检查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=365.68
但是当我稍微修改代码时,我得到了修改之前和修改之后的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=372
z=365.68

我不明白为什么从原始代码中删除括号后会有这么大的差异?

没有外括号,
(int)
强制转换只适用于
a

因此,将一个被截断的整数乘以一个正常的双精度,类型推断将
var
变成
double

对于括号,强制转换应用于乘法的结果。因此,整个结果被截断,类型推断将
var
转换为
int


因此,将
var
更改为
double
对两个示例都没有影响。(在第二种情况下,它将截断的
int
分配给
double
变量)

var
更改为
int
会将第二个示例变成编译器错误。

括号设置优先级

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

会话操作
()
的优先级大于乘法优先级。 在第一种情况下,您有:

double tmp = a*b;
int z = (int)tmp;
其次:

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

var z=(int)a*b;
a在相乘之前被转换成整数。所以它将是14*26.12。在第二种情况下,将a*b相乘,然后将结果转换为int