2017-01-16 18 views
8

Câu hỏi của tôi chỉ đơn giản là:Có phải cả hai "phao phức tạp" và "phao phức tạp" hợp lệ C?

Cả hai "phức tạp" và "phao phức" hợp lệ C?

Cả hai dường như được chấp nhận mà không có cảnh báo bởi gcc.

+0

Vì 'int long unsigned long' là hợp lệ, nên cả hai đơn hàng đều hợp lệ. Tôi đã không chính thức kiểm tra mặc dù. –

+0

http://port70.net/~nsz/c/c11/n1570.html#7.3.1p4: * Macro 'phức tạp ' mở rộng thành' _Complex; 'macro _'Complex_I' mở rộng đến biểu thức liên tục của kiểu 'const float _Complex', với giá trị của đơn vị ảo. *. Vì vậy, 'float' chỉ là dư thừa ở đây. –

+1

@ EugeneSh.Sử dụng gcc phức tạp trên các giá trị mặc định của riêng nó thành phức tạp đôi. – eleanora

Trả lời

6

complex là một vĩ mô từ complex.h mà mở rộng vào Bộ xác định kiểu _Complex. Điều này hoạt động như tất cả các loại thông số khác, ví dụ: int, bool, double. Đối với tất cả các loại thông số thuộc cùng một nhóm, bạn có thể kết hợp chúng theo nhiều thứ tự khác nhau. Đây được xác định bởi C11 6.7.2, tôi nhấn mạnh:

Ít nhất một Bộ xác định kiểu được đưa ra trong tuyên bố specifiers trong từng tuyên bố, và trong danh sách specifier-vòng trong từng tuyên bố struct và tên loại. Mỗi danh sách các loại thông số phải là một trong các đa số sau (được phân tách bằng dấu phẩy, khi có nhiều hơn một multiset cho mỗi mục); các loại thông số có thể xảy ra theo thứ tự bất kỳ, có thể được trộn lẫn với các tờ khai khác .

Rồi sau danh sách các nhóm hợp lệ của loại specifiers, nơi chúng ta tìm

  • float _Complex
  • double _Complex

Nghĩa là bất kỳ hoán vị của specifiers trong cùng một nhóm là tốt.


Để lấy một ví dụ khác, có một nhóm

  • unsigned long long, hoặc unsigned long long int

nào cho chúng ta kết hợp có thể như sau:

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

hoặc

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; 
... 

Tất cả đều có cùng ý nghĩa.

+4

Nếu bạn nghĩ rằng ở trên là hoàn toàn không hợp lý, bạn là chính xác. Ngôn ngữ C được thiết kế để làm xáo trộn. Sanity không bao giờ là một ưu tiên. – Lundin

+2

Hoặc "Đối với ngôn ngữ obfuscation C thiết kế được. Sự ưu tiên sanity không bao giờ là một". – chux

5

Có. Nói chung, thứ tự của "lời typey" ở đầu của một bản tuyên bố không quan trọng:

static const unsigned long int x = 42; 

cũng giống như

long const int unsigned static x = 42; 

tham khảo: C99, 6.7.2/2

[...] các loại thông số có thể xảy ra theo bất kỳ thứ tự nào, có thể là được trộn lẫn với các bộ khai báo khác.

(Cả float_Complex là loại specifiers.)

+2

N1570 nói * "Vị trí của một bộ định danh lớp lưu trữ khác với ở đầu khai báo các số trong một khai báo là một tính năng lỗi thời." *, Do đó, sử dụng 'static' ở nơi khác hơn là bắt đầu là một ý tưởng tồi. – user694733

+0

@ user694733 Nhưng điều đó chỉ áp dụng cho các bộ định danh lớp lưu trữ. Mã như 'tĩnh dài const int _Atomic dài dễ bay hơi unsigned * const dễ bay hơi * _Atomic * const x;' là hoàn toàn tốt trong C ... – Lundin

Các vấn đề liên quan