在C#中,对一个运算的式子的结果使用强制类型转换时,给式子加括号与不加括号结果为什么不一样

(float)sum/credit;
与 (float)(sum/credit);
结果完全不一样是怎么回事,下面是原题代码,希望高手过来帮帮我啊
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace property
{
class student
{
string[][] s = new string[5][] { new string[] { "离散数学", "5", "81" },
new string[] { "计算机组成原理", "4", "79" },
new string[] { "", "3", "90" },
new string[] { "", "4", "85" },
new string[] { "", "3", "67" },
};
public float WeightedAverage
{
get
{
int credit=0,sum=0;
for (int i=0;i<s.Length;i++)
{
credit+=Convert.ToInt32( s[i][1]);
sum+=Convert.ToInt32(s[i][1])*Convert.ToInt32(s[i][2]);
}
return (float)sum/credit;
}
}
}
class Program
{
static void Main(string[] args)
{
student s = new student();
Console.WriteLine(s.WeightedAverage);
}
}
}

这个涉及到的是隐式转换和显示转换的问题。
首先 (float)sum/credit;
拆分为分母和分子
分母:(fload)sum 将sum显式转化为float类型。
分子:credit 为int类型。
而/运算符在进行运算的时候 由于前后数据类型不一样,会触发隐式转化。即将/的结果隐藏转化为float类型。 例如我们 计算 13/3 得到的结果是4 而计算(float)13/3 得到的结果是4.3333333。。。。 因为13/3 默认转化为整形。而 显示转为为float的13 变为13.0再与3除 则结果就变为浮点型和整数计算得到13.0/3=4.3333....。
而(fload)(a/b)的计算顺序与前者不同因为括号改变了优先级,先通过C#内部计算转换机制计算a/b 然后将结果转化为浮点型

总之 a/b的问题是 都是整数则结果为整数。有一个是浮点型 责结果为浮点型。

而括号改变了计算规则。 显示转化转化的是右侧的数字。而/的计算优先级低于() 所以造成了你的结果不一致
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-28
(float)sum/credit; 这个是先吧 sum 转换成 float 类型后再 / credit
(float)(sum/credit); 这个是两个数除完了再转换成 float

结果不同的原因就在 sum 和 credit 声明成 int 类型的,
第一种情况:除之前把 sum 转换成了 float类型, 实际是 float/int 结果是一个 float 类型 是有小数的。
第二种情况:先做的除法后转的类型,实际是 int/int 结果还是一个 int 类型 结果被直接取整了小数点被去掉了,除完了再转成 float 就没有用了。本回答被提问者采纳
第2个回答  2011-04-28
运算符优先级的问题
第3个回答  2011-04-29
C#计算从右到左,先算左的再算右。然后再比较运算符的优先等级。()的优先等级比/高,自然就先算()。
(float)sum/credit: 先算 (float)sum的值:计算机线先读出整个等式,发现有个()自然先进行(float)计算,但是(float)单独不能计算,然后再加个sum,就能计算了。
(float)(sum/credit)先算sum/credit的值:理由同上
相似回答