如何直接将复数分配给变量?

kmi*_*las 7 c++ variable-assignment complex-numbers

使用complex类和库,如何为变量分配复数?

我知道我可以在第一次实例化复数时设置该值.
我也明白我可以将一个实例化的复数分配给另一个.
如何直接为变量分配复数?

参考:http:
//www.cplusplus.com/reference/complex/complex/operators/

例:

#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;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 9

对于(1.2,3.4),将调用内置的逗号运算符.

在逗号表达式E1,E2中,评估表达式E1,丢弃其结果,并且在表达式E2的评估开始之前完成其副作用(注意用户定义的运算符,不能保证排序).

逗号表达式结果的类型,值和值类别正是第二个操作数E2的类型,值和值类别.如果E2是临时的,则表达式的结果是临时的.如果E2是位字段,则结果是位字段.

它意味着1.2将被评估然后丢弃,最后3.4返回.

所以b = (1.2,3.4);相当于b = 3.4;,它会调用std::complex::operator=(const T& x):

分配x复数的实部.虚部设置为零.

这就是你得到结果的原因(3.4,0).

正如@paddy建议的那样,您可以解决以下问题:

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)
Run Code Online (Sandbox Code Playgroud)

  • 这解释了行为,但没有回答这个问题.也许建议修复是使用`b = complex <double>(1.2,3.4);`甚至`b = decltype(b)(1.2,3.4);` (4认同)

Jay*_*Jay 6

试试这个,你可以b={1.2, 3.4}用来分配一个复杂的值

#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)

}
Run Code Online (Sandbox Code Playgroud)