2016-03-23 15 views
5

Utilizzando la classe complex e la libreria, come si assegna un numero complesso a una variabile?Come assegnare direttamente numeri complessi a una variabile?

Capisco che posso impostare il valore quando prima istanziato il numero complesso.
Capisco anche che posso assegnare un numero complesso istanziato a un altro.
Come posso assegnare direttamente un numero complesso a una variabile?

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

Esempio:

#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

Cercare l'operatore virgola. –

+0

verrà stampato in questo modo solo vedere questo (_Il formato in cui sono formattati per l'inserimento di output è (reale, immag) _) dalla referenza. [http://www.cplusplus.com/reference/complex/complex/operators/] –

risposta

9

Per (1.2,3.4), sarà chiamato built-in comma operator.

In un'espressione virgola E1, E2, l'espressione E1 viene valutato, il risultato viene scartata, ei suoi effetti collaterali sono stati completati prima della valutazione dell'espressione E2 comincia (si noti che un operatore definito dall'utente, non può garantire sequenziamento).

Il tipo, il valore e la categoria di valore del risultato dell'espressione virgola sono esattamente il tipo, il valore e la categoria di valore del secondo operando, E2. Se E2 è temporaneo, il risultato dell'espressione è temporaneo. Se E2 è un campo di bit, il risultato è un campo di bit.

Significa 1.2 saranno valutate e poi scartati, finalmente 3.4 viene restituito.

Così b = (1.2,3.4); è equivalente a b = 3.4;, che chiamerà std::complex::operator=(const T& x):

Assegna x alla parte reale del numero complesso. La parte immaginaria è impostata su zero.

Ecco perché ottieni il risultato di (3.4,0).

Come @paddy suggerito, si potrebbe risolvere il problema come:

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

Questo spiega il comportamento ma non risponde alla domanda. Forse suggerisci che la soluzione è usare 'b = complex (1.2, 3.4);' o anche 'b = decltype (b) (1.2, 3.4);' – paddy

3

Il modo in cui si è utilizzato il vostro operatore di assegnazione = per la classe std::complex unica assegnata la real part del numero complesso.

Quindi b = (1.2,3.4); equivale a modificare la parte reale di b a 3.4 solo.

Per assegnare un numero complesso direttamente Penso che si possa utilizzare b = complex<double>(1.2,3.4);

+1

Guarda la tua formulazione. Non è possibile affermare che "l'operatore di assegnazione assegna solo la parte reale", quindi fornire una soluzione che utilizza correttamente l'operatore di assegnazione. Esiste più di un operatore di assegnazione per 'std :: complex '. Vedere http://en.cppreference.com/w/cpp/numeric/complex/operator%3D – paddy

6

Prova questa, è possibile utilizzare b={1.2, 3.4} per assegnare un valore complesso

#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

Volevo solo entrare in sull'atto con questo bad boy, complimenti di C++ 14:

#include <iostream> 
#include <complex> 

int main() { 
    using namespace std::literals; 
    std::complex<double> b; 
    b = 1.2 + 3.4i; 
    std::cout << b << "\n"; 
} 
+0

1. Questo spazio dei nomi '' std :: literals'' mi dà un errore. 2. Volevi dire "cout << b'', credo? 3. Sto ottenendo (1,2,0) come risultato, dopo aver regolato per 1 e 2. – kmiklas

+0

Sì, 'b'. Hai comunque bisogno di un compilatore C++ 14. –

Problemi correlati