6

Heute fand ich heraus, dass Sie einen solchen Code in C++ schreiben und kompilieren:Was macht diese dynamische Zuweisung?

int* ptr = new int(5, 6); 

Was ist der Zweck davon? Ich kenne natürlich die dynamische new int(5) Sache, aber hier bin ich verloren. Irgendwelche Hinweise?

+4

Für das, was es wert ist, der richtige Weg, dies in diesem Fall zu tun ist 'int * ptr = new int ((5, 6));'. 'int (5,6)' sollte zu einem Fehler führen, aber wenn er in Klammern gesetzt wird, wird er in eine 6 umgewandelt und dann verwendet. Das heißt, es ist hässlich. :) – GManNickG

+0

@GMan: Sie sollten dies als eine Antwort setzen, so dass wir es upvote können. – Zacky112

Antwort

13

Sie verwenden den Komma-Operator, der nur einen Wert auswertet (ganz rechts).

der Komma-Operator (,) wird an getrennten zwei oder mehrere Ausdrücke verwendet, daß enthalten sind, wo nur ein Ausdruck erwartet wird. Wenn der Satz von -Ausdrücken für einen -Wert ausgewertet werden muss, wird nur der äußerste rechte Ausdruck berücksichtigt.

Source

Die Speicheradresse, die der Zeiger auf mit einem Wert von 6 oben initialisiert zeigt.

+0

Da der Operator (,) seinen ersten Operanden verwirft, ist er gleich wie new int (6). Recht? – Stringer

+3

Ja das ist richtig. Aber Sie könnten einen anderen Ausdruck anstelle von 5 haben, den Sie evaluieren und 6 zurückgeben möchten. Es wird alle Ausdrücke auswerten, aber die letzte zurückgeben. –

+1

http://msdn.microsoft.com/en-us/library/zs06xbxh(VS.80).aspx Aber bei diesem Link sagt Microsoft "Wo das Komma normalerweise als Trennzeichen verwendet wird (zum Beispiel in tatsächlichen Argumente zu Funktionen oder Aggregat-Initialisierer), der Komma-Operator und seine Operanden müssen in runde Klammern gesetzt werden. " Wäre Ausdruck in int (Ausdruck) nicht als Argumentliste zu zählen und würde daher das Komma nicht als Trennzeichen ausgewertet? – Bob

1

Mein Compiler, g ++, gibt einen Fehler zurück, wenn Sie dies versuchen.

Mit welchem ​​Compiler oder Code haben Sie das gesehen?

+0

Visual Studio 2008. Ich schrieb diesen Code. – Stringer

+0

Er kompiliert in MSVC 6.0 und initialisiert den Speicherort ptr mit Wert 6. –

1

Ich glaube, es ist ein Fehler, der eine Art von 2D-Array zuweisen wollte. Das können Sie in C++ jedoch nicht tun. Das Snippet wird tatsächlich kompiliert, da es den Kommaoperator verwendet, der den letzten Ausdruck zurückgibt und die Ergebnisse aller anderen ignoriert. Das bedeutet, dass die Aussage äquivalent ist zu:

int* ptr = new int(6); 
1

Die 5 wird ignoriert. Dies ordnet dem Heap ein int zu und initialisiert es (5,6).

das Ergebnis einer Reihe von durch den Komma-Operator getrennt Aussagen ist der Wert der letzten Anweisung, so dass der int bis 6

1

einfach das tut initialisiert wird:

int* ptr = new int(6); 

Soweit Komma Der Bediener ist betroffen, wenn Sie die gewünschte Aufgabe nicht ausführen können. Es gibt keine Verwendung von Anwendung Tricks wie:

int* ptr = new int(5, 6);