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

时间:2016-03-23 03:56:14

标签: 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;
}

4 个答案:

答案 0 :(得分:9)

对于(1.2,3.4),将调用built-in comma operator

  

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

逗号表达式结果的类型,值和值类别正是第二个操作数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)

答案 1 :(得分: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)

}

答案 2 :(得分:4)

您使用=类的作业运算符std::complex的方式仅指定了复数的real part

所以b = (1.2,3.4);相当于仅将b的实际部分更改为3.4

要直接指定复数,我认为您可以使用b = complex<double>(1.2,3.4);

答案 3 :(得分:1)

I just wanted to get in on the act with this bad boy, compliments of 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";
}