/ / C ++ - Differenz zwischen 0 und 0,0 - c ++, doppelt

C ++ Unterschied zwischen 0 und 0.0 - C ++, doppelt

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 № 1

Ein 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.