2016-06-05 10 views
1

Ich habe einen Code, der komplexe Zahl verwendet.C: deklarieren Typ in <complex.h>

Wenn ich die Variable "x" zu erklären, die mit der Größe der Doppel eine komplexe Zahl ist, sollte ich erklären ihn als:

complex double x; 

oder

double complex x; 

?
Macht es einen Unterschied? Hat jemand Erfahrung auf Compilern nicht beide zu verstehen?

+0

https://stackoverflow.com/questions/6418807/how-to-work-with-complex-numbers-in-c –

+1

Es macht wahrscheinlich keinen Unterschied, weil alle "typy Worte" am Anfang einer Deklaration sein können neu geordnet: 'static const unsigned long int 'ist das gleiche wie' int unsigned static long const ', also würde ich annehmen, dass' _Complex' (und sein Makroalias 'complex') derselben Regel folgen. – melpomene

+0

Ich weiß nicht, warum diese vernünftige Frage abgelehnt wird. –

Antwort

4

Der C-Standard sagt, in 6.7.2 Typ Specifiers

Jede Liste von Typdeklarierer eine der folgenden Sätze sein soll [...] die Typdeklarierer in beliebiger Reihenfolge auftreten können

  • ...
  • float _Complex
  • double _Complex
  • long double _Complex

Obwohl der Standard konsequent setzt _Complex (und damit complex) nach Doppel, float und long double erlaubt es, jede Bestellung

#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; 
} 

Demo: http://coliru.stacked-crooked.com/a/5cbc966b0c1b096e

+0

Das macht so viel Sinn. Vielen Dank. – Tom

+0

Es macht für diese Frage keinen großen Unterschied, aber Sie geben den C99-Standard anstelle des aktuellen C11-Standards an. –

+0

@KeithThompson Ah, in der Tat, c11 ist die Formulierung besser, danke für die Aufdeckung. – Cubbi

2

Dies wird angegeben in die C Standard (N1570 Entwurf), Abschnitt 6.7.2.

A Typ-Spezifizierer ist eine von mehreren Schlüsselwörtern und anderen Konstrukten, einschließlich float, long, double und _Complex. Absatz 2 sagt (Hervorhebung hinzugefügt)

Mindestens ein Typspezifizierer ist in der Erklärung Bezeich in jeder Erklärung und in der Spezifizierer-Qualifizierer-Liste in jede Strukturdeklaration und der Typname angegeben werden. Jede Liste von Typspezifizierern soll eine der folgenden Multimengen sein (durch Kommata begrenzt, wenn mehr als ein Multiset pro Element vorhanden ist); Die Typspezifizierer können in beliebiger Reihenfolge auftreten, möglicherweise vermischt mit der anderen Deklaration Spezifizierer.

Und in Absatz 5:

Jede der durch Kommata getrennte Multimengen bezeichnet die gleiche Art, mit der Ausnahme, dass [irrelevant Ausnahme weggelassen].

die hier gelisteten Multimengen umfassen:

  • float _Complex
  • double _Complex
  • long double _Complex

Das bedeutet, dass zum Beispiel long double _Complex und _Complex double long beide gleichermaßen gültig sind und die gleiche Bedeutung haben.

(Der Standard verwendet den leicht obskuren Begriff „multiset“, weil die Anzahl, wie oft ein Typspezifizierer auftritt sinnvoll sein. Wenn nicht für long long, wäre es das Wort verwendet hat „set“.)

Und die <complex.h> Standardkopf definiert das Makro complex, das auf das Schlüsselwort _Complex erweitert wird.

Ich kenne keinen C-Compiler, der _Complex unterstützt, erlaubt aber keine Typbezeichner in beliebiger Reihenfolge. Wenn Sie einen finden, reichen Sie einen Fehlerbericht ein.

Nachdem gesagt, es hat keinen Sinn willkürlich Typspezifizierer neu zu ordnen. double complex ist die idiomatische Form (die natürlich #include <complex.h> erfordert). Obwohl die Syntax sie nicht so behandelt, kann man sich double als Adjektiv und complex als Substantiv vorstellen; double complex ist ein komplexer Typ, kein Doppel Typ.