2017-01-16 89 views
8

我的問題很簡單:「複數浮點」和「浮點複數」是否都有效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

回答

6

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

5

是的。一般情況下, 「請鍵入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