2017-01-16 5 views
8

私の質問はこれだけです:「複雑な浮動小数点」と「浮動小数点の複合」の両方が有効ですか?

"float complex"と "float complex"はどちらも有効ですか?

の両方がgccので警告なしに受け入れられているように見えます。

+0

'int long unsigned long'が有効なので、両方の注文が有効であることが理にかなっています。私は正式にチェックしていない。 –

+0

http://port70.net/~nsz/c/c11/n1570.html#7.3.1p4:*マクロ 'complex'が' _Complexに展開; 'マクロ _'Complex_I'は、に展開します'const float _Complex'型の定数式は、虚数単位の値を持ちます。だから、「フロート」はちょうどここで冗長です。 –

+1

@ EugeneSh. gcc複合体を使用すると、それ自体がデフォルトで2重複合体になります。 – eleanora

答えて

6

complexは、型指定_Complexに展開のcomplex.hからマクロあります。これは、他のすべての型指定子と同様に動作します。たとえば、int, bool, doubleです。同じ「グループ」に属するすべての型指定子について、それらをさまざまな順序で組み合わせることができます。少なくとも一つの型指定が宣言に与えなければならない

各構造体宣言の 各宣言で指定子、および指定子修飾子リストと:これはC11 6.7.2、強調鉱山で指定されタイプ名。型指定 の各リストは、次のマルチセット( 項目ごとに複数の多重集合がある場合、カンマで区切られた)のいずれかでなければなりません。 型指定は、おそらく他の宣言 指定子と混合、任意の順序に 起こり得ます。

はその後、我々は中に指定子の任意の順列を意味

  • float _Complex
  • double _Complex

を見つけ型指定の有効なグループのリストを、次の同じグループは大丈夫です。

unsigned long long x; 
long unsigned long y; 
long long unsigned z; 
0123:


別の例を取るためには、グループ

  • unsigned long long、または以下の可能な組み合わせ私たちを与えるunsigned long long int

にあり

または

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

5

はい。一般的には、宣言の冒頭に "typey言葉" の順序は重要ではありません:

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

関連する問題