“复数浮点”和“浮点复数”是否都有效C?

问题描述:

我的问题很简单:“复数浮点”和“浮点复数”是否都有效C?

都是“复杂的浮动”和“浮复杂的”有效的C?

这两个似乎都没有被海湾合作委员会的警告接受。

+0

由于'INT长无符号long'是有效的,它是有道理的,这两个订单是有效的。虽然我没有正式检查过。 –

+0

http://port70.net/~nsz/c/c11/n1570.html#7.3.1p4:*宏 'complex' 扩展为'_Complex;'宏 _'Complex_I' 膨胀到常量表达式'const float _Complex',其中虚数单元的值为*。所以'float'在这里只是多余的。 –

+1

@ EugeneSh。使用gcc复合函数以其自己的默认值加倍复杂。 – eleanora

complex是从complex.h宏其扩展到类型说明符_Complex。这与所有其他类型说明符相同,例如int, bool, double。对于属于相同“组”的所有类型说明符,可以按各种顺序组合它们。

至少有一个类型说明符应在声明中给予 符在每个声明,并在说明符限定符列表中 每个结构声明和:这是由C11 6.7.2,重点煤矿指定类型名称。类型说明符 的每个列表应该是以下多重集之一(用逗号分隔,当 每个项目有多个多重集时); 类型说明符可能 以任何顺序发生,可能与其他声明 说明符混合。

然后如下类型说明符的有效群体,我们发现

  • float _Complex
  • double _Complex

含义的列表,在该说明符的任意排列同组也很好。


再举一个例子,有一组

  • unsigned long long,或unsigned long long int

这给了我们以下可能的组合:

unsigned long long x; 
long unsigned long y; 
long long unsigned z; 

unsigned long long int a; 
unsigned long int long b; 
unsigned int long long c; 
int unsigned long long d; 
long unsigned long int e; 
long long unsigned int f; 
long long int unsigned g; 
long unsigned int long h; 
... 

这些都意味着同样的事情。

+4

如果您认为上述内容完全不合理,那么您是正确的。 C语言是为混淆而设计的。理智从来不是优先考虑的事情。 – Lundin

+2

或者“对于语言混淆C而言,设计是优先的理智从来就不是”。 – chux

是的。一般情况下, “请键入y字” 在声明的开头的顺序并不重要:

static const unsigned long int x = 42; 

相同

long const int unsigned static x = 42; 

参考:C99,6.7.2/2

类型说明符可能以任何顺序出现,可能与其他声明说明符混合使用 。

(两者float_Complex是类型说明符。)

+2

N1570表示*“在声明中声明 声明的开始处以外的存储类说明符的放置是一个过时的特性。”*,因此在其他位置使用'static'不是一个好主意。 – user694733

+0

@ user694733但这只适用于存储类说明符。类似于'static long const int _Atomic long volatile unsigned * const volatile * _Atomic * const x;'在C中是完全正确的代码... – Lundin