我有一个使用复数的代码。
当我声明变量“x”,这是一个大小为double的复数时,我应该将其声明为:
complex double x;
或
double complex x;
?
它有什么不同吗?有没有人有编译器的经验
不理解他们中的任何一个?
答案 0 :(得分:4)
C标准在6.7.2类型说明符中说明
每个类型说明符列表应为以下集合之一[...]类型说明符可以按任何顺序出现
- ...
float _Complex
double _Complex
long double _Complex
虽然标准在double,float和long double之后始终放置_Complex
(因此complex
),但它允许任何顺序
#include <complex.h>
int main(void)
{
long double complex d1;
double long complex d2;
complex long double d3;
complex double long d4;
double complex long d5;
long complex double d6;
}
答案 1 :(得分:2)
这在C Standard(N1570草案)第6.7.2节中指定。
类型说明符是多个关键字和其他结构中的任何一种,包括 float
, long
, double
和 _Complex
。第2段说(重点补充)
声明中至少应给出一个类型说明符 每个声明中的说明符,以及说明符限定符列表中的说明符 每个结构声明和类型名称。每个类型说明符列表 应该是以下多个集合之一(逗号分隔,何时 每个项目有多个multiset); 类型说明符可以 以任何顺序发生,可能与其他声明混合 说明符。
在第5段中:
除了[无关的例外省略]之外,每个以逗号分隔的多个集合都指定相同的类型。
列出的多重集包括:
float _Complex
强> double _Complex
强> long double _Complex
强> 这意味着,例如,long double _Complex
和_Complex double long
同样有效,并具有相同的含义。
(该标准使用稍微模糊的术语“multiset”,因为类型说明符出现的次数可能有意义。如果不是long long
,它将使用“set”一词。)
<complex.h>
标准标头定义宏complex
,扩展为关键字_Complex
。
我知道没有支持_Complex
的C编译器,但不允许类型说明符按任何顺序排列。如果找到,请提交错误报告。
话虽如此,任意重新排序类型说明符都没有意义。 double complex
是最惯用的形式(当然需要#include <complex.h>
)。虽然语法不以这种方式对待它们,但您可以将double
视为形容词,将complex
视为名词; double complex
是复杂类型,而不是 double 类型。