Gibt es in C ++ einen Unterschied zwischen 0 und 0,0? Welches sollten Sie zum Initialisieren eines Double verwenden?
Vielen Dank
Antworten:
14 für die Antwort № 1Ein wörtliche 0
gilt als ein int
wörtlich; wörtlich 0.0
ist ein double
wörtlich. Bei der Zuordnung zu einem double
, wird entweder funktionieren (seit dem int
kann in einer sich erweiternden Konvertierung gegossen werden); aber Gießen 0.0
zu einem int
ist eine engere Konvertierung und muss explizit ausgeführt werden. d.h. (int)0.0
.
8 für die Antwort № 2
Ich versuche, meine Konstanten typkonsistent zu halten. 0 für ints. 0.0f oder 0.f für Float und 0.0 für Double.
Für mich ist der wichtigste Grund dafür, dass der Compiler und der Programmierer dasselbe sehen.
Wenn ich das tue ...
float t=0.5f;
float r;
r= 1 * t;
... sollte r 0 oder 0,5 zugewiesen werden? Es gibt kein Zögern, wenn ich dies stattdessen tue
float t=0.5f;
float r;
r= 1.0f * t;
5 für die Antwort № 3
Einer scheint ein Integer-Literal zu sein, der andere einFließkomma-Literal. Für den Compiler ist es egal, ob Sie Floats initialisieren oder mit Integer-Literalen verdoppelt werden. In jedem Fall wird das Literal in eine interne Darstellung kompiliert.
Ich würde gerne 0.0 vorschlagen, um Ihre Absicht (für andere Programmierer) explizit klar zu machen.
0 für die Antwort № 4
Hier ist die Visual-C ++ - Demontage für:
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
Sie produzierten dieselbe Baugruppe. Visual-C ++ verwendet die XOR-Methode des XMM-Registers mit sich selbst. Hätten Sie die Ganzzahl 0 zuerst geladen und dann in das XMM-Register verschoben, hätte dies eine zusätzliche Anweisung benötigt 0.0
kann als Literal sowie als zusätzliches geladen werdenNutzloser Befehl Laden Laden einer Ganzzahl 0 und Verschieben in ein Fließkomma-Register. Beide sind nicht optimal. Es scheint also, als ob es wirklich keine Rolle spielt, da der Compiler-Writer davon ausgehen muss, dass diese Optimierung seit langem bekannt ist Das liegt auf der Hand: Wenn 100% Portabilität erforderlich ist, ist es portabler, eine Inline-Funktion zu schreiben, die manuell die XOR-Technik verwendet.