【问题标题】:How to directly assign complex numbers to a variable?如何直接将复数分配给变量?
【发布时间】:2016-07-10 05:40:00
【问题描述】:

使用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;
}

【问题讨论】:

标签: c++ variable-assignment complex-numbers comma-operator


【解决方案1】:

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

在逗号表达式 E1, E2 中,表达式 E1 被求值,其结果被丢弃,其副作用在表达式 E2 开始求值之前完成(注意,用户定义的运算符,不能保证顺序)。

逗号表达式结果的类型、值和值类别正是第二个操作数 E2 的类型、值和值类别。如果 E2 是临时的,则表达式的结果就是那个临时的。如果 E2 是位域,则结果是位域。

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

所以b = (1.2,3.4); 等价于b = 3.4;,它将调用std::complex::operator=(const T&amp; 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)

【讨论】:

  • 这解释了行为,但没有回答问题。也许建议解决方法是使用b = complex&lt;double&gt;(1.2, 3.4); 甚至b = decltype(b)(1.2, 3.4);
【解决方案2】:

您对std::complex 类使用赋值运算符= 的方式只分配了复数的real part

所以b = (1.2,3.4);相当于只将b的实部改为3.4

直接分配复数我想你可以使用b = complex&lt;double&gt;(1.2,3.4);

【讨论】:

【解决方案3】:

试试这个,你可以使用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)

}

【讨论】:

    【解决方案4】:

    我只是想和这个坏男孩一起行动,赞美 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";
    }
    

    【讨论】:

    • 1.这个std::literals 命名空间给了我一个错误。 2. 你的意思是cout &lt;&lt; b,我相信? 3. 在调整 1 和 2 后,我得到 (1.2,0)。
    • 是的,b。不过你需要一个 C++14 编译器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多