C ++中0和0.0之间有区别吗?您应该使用哪个来初始化双倍?
由于
答案 0 :(得分:15)
文字0
被视为int
字面值;文字0.0
是double
字面值。分配到double
时,两者都可以使用(因为int
可以在扩展转换中投射);但是,将0.0
投射到int
是一个缩小的转换,必须明确地完成;即(int)0.0
。
答案 1 :(得分:10)
我试着保持我的常量类型一致。 0表示整数。浮点数为0.0f或0.f,双精度为0.0。
对我而言,执行此操作的最重要原因是编译器和程序员看到同样的事情。
如果我这样做......
float t=0.5f;
float r;
r= 1 * t;
...应该分配0或.5?如果我这样做,毫不犹豫......
float t=0.5f;
float r;
r= 1.0f * t;
答案 2 :(得分:5)
一个似乎是整数文字,另一个是浮点文字。对于编译器来说,使用整数文字初始化浮点数还是双精度数并不重要。无论如何,文字将被编译成一些内部表示。
我倾向于建议0.0,以使你的意图(对其他程序员)明确清楚。
答案 3 :(得分:1)
以下是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
他们生产了相同的组件。 Visual C ++使用对XMM寄存器自身进行XOR运算的方法。如果您首先加载了整数0,然后将其移至XMM寄存器,则会使用一条额外的指令。假设我们假设如何将0.0
当作字面量以及额外的无用指令加载,先加载整数0然后将其移动到浮点寄存器中,这都不是最佳选择,因此看起来好像真的没关系,因为编译器作者必须假定这种优化已经很久了,因为它很明显。如果需要100%的可移植性,那么编写手动使用XOR技术的内联函数将更容易移植。