2016-03-23 7 views
5

Wie kann ich einer Variablen mithilfe der complex-Klasse und -Bibliothek eine komplexe Zahl zuweisen?Wie ordnen Sie einer Variablen direkt komplexe Zahlen zu?

Ich verstehe, dass ich den Wert festlegen kann, wenn ich zuerst die komplexe Zahl instanziiere.
Ich verstehe auch, dass ich eine instanziierte komplexe Zahl einer anderen zuweisen kann.
Wie kann ich einer Variablen direkt eine komplexe Zahl zuweisen?

Referenz:
http://www.cplusplus.com/reference/complex/complex/operators/

Beispiel:

#include <iostream> 
#include <complex> 

int main() { 
    complex<double> a(1.2,3.4), b; 
    cout << a; //-> (1.2,3.4) 
    b = a; 
    cout << b; //-> (1.2,3.4) 
    b = (1.2,3.4); 
    cout << b; //-> (3.4,0) <-- what the heck is this?? 
    return 0; 
} 
+1

Suchen Sie den Komma-Operator. –

+0

es wird auf diese Weise gedruckt nur sehen Sie dies (_Das Format, in dem sie für die Ausgabe eingefügt werden, ist (real, imag) _) aus Ihrer Referenz. [http://www.cplusplus.com/reference/complex/complex/operators/] –

Antwort

9

Für (1.2,3.4) wird built-in comma operator genannt.

In einem Komma Ausdruck E1, E2, der Ausdruck E1 ausgewertet wird, wird das Ergebnis verworfen und seine Nebenwirkungen vor der Auswertung des Ausdrucks E2 beginnt abgeschlossen sind (beachten Sie, dass ein benutzerdefinierter Operator, nicht Sequenzierung garantieren).

Der Typ, der Wert und der Werttyp des Ergebnisses des Kommaausdrucks entsprechen genau dem Typ, dem Wert und dem Werttyp des zweiten Operanden E2. Wenn E2 ein temporäres ist, ist das Ergebnis des Ausdrucks temporär. Wenn E2 ein Bit-Feld ist, ist das Ergebnis ein Bit-Feld.

Es bedeutet 1.2 ausgewertet werden und dann verworfen, schließlich 3.4 zurückgegeben.

So b = (1.2,3.4); entsprechen b = 3.4;, die std::complex::operator=(const T& x) nennen:

Ordnet x den Realteil der komplexen Zahl. Eingebildeter Teil wird auf Null gesetzt.

Deshalb erhalten Sie das Ergebnis (3.4,0).

Als @paddy vorgeschlagen, könnten Sie das Problem wie lösen:

b = {1.2,3.4};     // copy-list-initialization (since c++11) 
b = complex<double>(1.2, 3.4); // copy assignment via a temporary complex<double> 
b = decltype(b)(1.2, 3.4);  // same as the above (since c++11) 
+4

Dies erklärt das Verhalten, beantwortet aber die Frage nicht. Vielleicht schlagen Sie vor, dass der Fix 'b = complex (1.2, 3.4) verwenden soll;' oder sogar 'b = decltype (b) (1.2, 3.4);' – paddy

3

Die Art und Weise Sie Ihren Zuweisungsoperator = für die std::complex Klasse verwendet nur die real part der komplexen Zahl zugeordnet.

Also b = (1.2,3.4); entspricht dem Ändern des Realteils von b nur zu 3.4.

Um eine komplexe Zahl direkt denken, ordne ich Sie b = complex<double>(1.2,3.4);

+1

Achten Sie auf Ihre Formulierung. Sie können nicht sagen, dass der "Zuweisungsoperator nur das reelle Teil zuweist" und dann eine Lösung bereitstellen, die den Zuweisungsoperator korrekt verwendet. Es gibt mehr als einen Zuweisungsoperator für 'std :: complex '. Siehe http://en.cppreference.com/w/cpp/numeric/complex/operator%3D – paddy

6

Versuchen Sie diese verwenden können, Sie b={1.2, 3.4} verwenden können, ein komplexer Wert

#include <complex> 
#include <iostream> 
using namespace std; 
int main() 
{ 
    complex<double> a = {1,2}; 
    complex<double> b; 

    b = {1.2, 3.4}; 

    cout << a + b << "\n"; // (2.2,5.4) 

} 
1

Ich wollte zuweisen nur mit diesem auf dem mitmischen Bad Boy, Komplimente von C++ 14:

+0

1. Dieser '' std :: literals'' Namespace gibt mir einen Fehler. 2. Du meinst "cout << b", glaube ich? 3. Ich bekomme (1,2,0) als Ergebnis nach der Anpassung für 1 und 2. – kmiklas

+0

Yeah, 'b'. Sie benötigen jedoch einen C++ 14-Compiler. –