变量值之间的差异

时间:2012-10-26 14:06:05

标签: 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值之间的差异很大。

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

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

4 个答案:

答案 0 :(得分:7)

如果没有外括号,(int)演员表仅适用于a 因此,您最终将截断的整数乘以正常的double,类型推断将var变为double

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


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

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

答案 1 :(得分:2)

括号设置优先级

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

答案 2 :(得分:0)

对话操作()的优先级大于多重优先级。 在第一种情况下,你有:

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

和第二名:

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

答案 3 :(得分:0)

var z=(int)a*b;

a在被乘之前被转换为int。所以它将是14 * 26.12。在第二种情况下,你将a * b相乘并在之后将结果转换为int。

相关问题