有在C ++ 0和0.0之间的差? 你应该使用哪一种初始化双?
谢谢
有在C ++ 0和0.0之间的差? 你应该使用哪一种初始化双?
谢谢
一个文字0
被认为是一个int
字面; 字面0.0
是一个double
字面值。 当分配给一个double
,无论是将工作(由于int
可以在扩大转换浇铸); 然而,铸造0.0
到int
是收缩转换,并且必须被明确地进行; 即(int)0.0
。
我尽量保持我的常量类型一致。 0整数。 0.0F或0.f浮法,以及用于双0.0。
对我来说,要做到这一点最重要的原因是为了让编译器和程序员看到同样的事情。
如果我这样做...
float t=0.5f;
float r;
r= 1 * t;
... r应该分配0或0.5? 有没有犹豫,如果我这样做,而不是...
float t=0.5f;
float r;
r= 1.0f * t;
一个似乎是字面的整数,其他浮点文字。 这真的是你是否初始化浮点或双精度整数文字不要紧,编译器。 在任何情况下的文字会被编译成一些内部表示。
我倾向于为了使你的意图(对其他程序员)明确清晰的建议0.0。
这里是Visual-C ++拆装:
int main() {
double x = 0;
//
double y = 0.0;
//
double z = x * y;
return 0;
}
int main() {
00007FF758A32230 push rbp
00007FF758A32232 push rdi
00007FF758A32233 sub rsp,128h
00007FF758A3223A mov rbp,rsp
00007FF758A3223D mov rdi,rsp
00007FF758A32240 mov ecx,4Ah
00007FF758A32245 mov eax,0CCCCCCCCh
00007FF758A3224A rep stos dword ptr [rdi]
double x = 0;
00007FF758A3224C xorps xmm0,xmm0
00007FF758A3224F movsd mmword ptr [x],xmm0
//
double y = 0.0;
00007FF758A32254 xorps xmm0,xmm0
00007FF758A32257 movsd mmword ptr [y],xmm0
//
double z = x * y;
00007FF758A3225C movsd xmm0,mmword ptr [x]
00007FF758A32261 mulsd xmm0,mmword ptr [y]
00007FF758A32266 movsd mmword ptr [z],xmm0
return 0;
00007FF758A3226B xor eax,eax
}
00007FF758A3226D lea rsp,[rbp+128h]
00007FF758A32274 pop rdi
00007FF758A32275 pop rbp
00007FF758A32276 ret
他们生产的相同部件。 视觉-C ++使用的异或的XMM寄存器与it'self的方法。 假如你第一次加载整数0,然后移动它到XMM寄存器它会使用一个额外的指令。 鉴于我们对如何假设0.0
可以加载为文字,以及额外的无用的指令负荷加载0-2的整数,然后将它移动到一个浮点寄存器,也不是最优的,因此看起来就像真的没关系因为编译器作者我们必须承担这种优化已经知道了很长的时间,因为它是一种显而易见的。 如果需要100%的便携性,那么它是更便携编写手动使用XOR技术的内联函数。