gpt4 book ai didi

c++ - std::complex 初始化问题

转载 作者:行者123 更新时间:2023-11-30 03:36:19 28 4
gpt4 key购买 nike

考虑以下代码

#include <complex>
#include <iostream>

int main(int argc, char **argv)
{
std::complex<double> a = 1+1i;
std::cout<<"a ="<<a<<"\n";
return 0;
}

当我使用 Apple LLVM 版本 8.0.0 (clang-800.0.42.1) 进行编译时,我得到的输出是

a =(1,0)

有人可以解释为什么虚部初始化为零吗?

最佳答案

1 + 1i正在使用 (GCC) 扩展创建类似于/等同于 C99 的 _Complex int 的类型类型。该类型可转换为真实类型,如 intdouble . std::complex_Complex 不兼容, 它没有任何构造函数来创建 std::complex来自_Complex (*).但是std::complex<T>确实有一个采用 T 的构造函数.这会触发上述转换 _Complex -> T -> std::complex<T> .

因此 OP 中的代码等同于:

#include <complex>
#include <iostream>

int main()
{
double d = 1+1i;
std::complex<double> a = d;
std::cout<<"a ="<<a<<"\n";
return 0;
}

1 + 1i的虚部在转换为 double 时被丢弃.


为防止此类意外,请尝试使用警告和 -pedantic 进行编译.这个例子似乎是 clang 实际上用 -pedantic 添加额外警告的少数几个地方之一。标志(对于 gcc,-pedantic 在许多情况下更改警告输出):

prog.cc:6:19: warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]    double d = 1+1i;

(*) IIRC,std::complex在 C++98 中引入,而 _Complex在 C99 中引入。

关于c++ - std::complex 初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785945/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com