Gibt es einen Unterschied zwischen 0 und 0.0 in C++? Was sollten Sie zum Initialisieren eines Doubles verwenden?
Vielen Dank
Gibt es einen Unterschied zwischen 0 und 0.0 in C++? Was sollten Sie zum Initialisieren eines Doubles verwenden?
Vielen Dank
Ein Wort 0
gilt als ein int
wörtlich; wörtlich 0.0
ist ein double
wörtlich. Bei der Zuordnung zu a double
beide funktionieren (da die int
kann in eine Verbreiterungsumwandlung gegossen werden); jedoch Gießen 0.0
zu einem int
ist eine einschränkende Konvertierung und muss explizit durchgeführt werden; dh (int)0.0
.
und 0.0f ist ein Gleitkommawert. 😀
– Gordon Gustafson
6. September 2009 um 0:32 Uhr
@Rob, sagst du, dass ein Double nicht implizit in ein Int konvertiert werden kann? In Betracht ziehen int a = 0.0;
.
– Johannes Schaub – litb
6. September 2009 um 1:05 Uhr
Ein Double kann mit Sicherheit einem Int ohne expliziten Cast zugewiesen werden. Dieser Teil der Antwort muss überarbeitet werden.
– Brian Neal
6. September 2009 um 14:59 Uhr
Vielleicht bedeutet Rob “muss” im Sinne von “um Warnungen bei
– Steve Jessop
6. September 2009 um 16:12 Uhr
Ich denke, 0 bis 0,0 Casting erfolgt in der Kompilierzeit. Habe ich recht?
– Danke
17. Juni 2015 um 11:01 Uhr
Nosredna
Ich versuche, meine Konstanten typkonsistent zu halten. 0 für int. 0.0f oder 0.f für Float und 0.0 für Double.
Für mich ist der wichtigste Grund, dies zu tun, damit der Compiler und der Programmierer dasselbe sehen.
Wenn ich das mache…
float t=0.5f;
float r;
r= 1 * t;
…sollte r 0 oder .5 zugewiesen werden? Es gibt kein Zögern, wenn ich das stattdessen tue …
float t=0.5f;
float r;
r= 1.0f * t;
Ja, C ist in Schwierigkeiten, wenn es jemals Gleitkomma-Hex-Literale unterstützen will, nicht wahr? 🙂
– Nosredna
6. September 2009 um 4:49 Uhr
Können Sie das bitte erläutern? warum sollte r jemals 0 zugewiesen werden?
– pingu
2. Juli 2012 um 15:42 Uhr
im ersten Fall ist der Wert 1 eine Ganzzahl und wird vor der Multiplikation heraufgestuft.
– EvilTeach
31. Juli 2018 um 16:15 Uhr
Das eine scheint ein Integer-Literal zu sein, das andere ein Fließkomma-Literal. Für den Compiler spielt es keine Rolle, ob Sie Floats oder Doubles mit Integer-Literalen initialisieren. In jedem Fall wird das Literal zu einer internen Darstellung kompiliert.
Ich würde eher 0.0 vorschlagen, um Ihre Absicht (für andere Programmierer) deutlich zu machen.
Tatsächlich kann dies eine Rolle spielen, da der Compiler anstelle des Ladens von 0, was eine Einzelzyklusanweisung ist, möglicherweise eine Null aus dem ROM lädt. Wenn das gesagt ist, wäre das irgendwie albern, aber andererseits sind wir Affen.
– Benutzer2356685
31. Juli 2018 um 15:39 Uhr
Hier ist die Visual-C++-Disassemblierung 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 die gleiche Baugruppe. Visual-C++ verwendet die Methode der XOR-Verknüpfung des XMM-Registers mit sich selbst. Hätten Sie zuerst die Ganzzahl 0 geladen und sie dann in das XMM-Register verschoben, wäre eine zusätzliche Anweisung verwendet worden. Angesichts unserer Hypothese darüber, wie die 0.0
kann als Literal geladen werden, ebenso wie die zusätzliche nutzlose Befehlsladung, die eine ganze Zahl 0 lädt und sie dann in ein Gleitkommaregister verschiebt, beides ist nicht optimal, also scheint es, als ob es wirklich keine Rolle spielt, weil der Compiler-Writer wir annehmen müssen Diese Optimierung ist seit langem bekannt, weil sie irgendwie offensichtlich ist. Wenn eine 100-prozentige Portabilität erforderlich ist, ist es besser, eine Inline-Funktion zu schreiben, die die XOR-Technik manuell verwendet.