这更像是一个学术问题,而不是我真正担心表现的问题。我真的很好奇。我还在我的,有限的编程经验中学到了编译器只有一半的时间才智能。
我有一个静态类,其中定义了一个常量int
,我需要将该常量除以另一个整数。现在,我需要从该分区返回的浮点值,所以我不能将它们都作为整数保留。
const int CONSTANTINTEGER = 69;
int integer = 0;
float floatValue = 0f;
for(integer = 0; integer < CONSTANTINTEGER; integer++) {
float floatValue = integer / (float)CONSTANTINTEGER;
//use floatValue for algorithm.....
}
现在,我的问题:编译器是否足够聪明,可以创建一个常量浮点数代替(float)CONSTANTINTEGER
,还是每个循环都将整数转换为浮点数?
答案 0 :(得分:4)
语言规范可以帮助我们解决这个问题。 C#5规范第7.19节规定:
常量表达式必须是null文字或具有以下类型之一的值:sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,object,string或任何枚举类型。在常量表达式中只允许使用以下结构:
- ...
- 投射表达式,前提是目标类型是上面列出的类型之一。
...
只要表达式满足上面列出的要求,就会在编译时计算表达式。即使表达式是包含非常量构造的较大表达式的子表达式,也是如此。
您还可以通过查看IL来验证这一点,在这种情况下,IL具有:
IL_000a: ldc.r4 69.
当它为除法运算加载除数时。