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.
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.
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ặcunsigned 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.
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
và _Complex
là loại specifiers.)
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
@ 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
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ù. –
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. –
@ 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