Có phải lâu dài không có thời gian dài hay không?


153

Tôi tìm thấy cả hai long int longint long longcó thể biên dịch cho một loại biến. Có sự khác biệt giữa long int long, int long long, long longlong long int?

Nói chung, là loại giống hệt nhau nếu nó có cùng số lượng long ?

1 dài:

long l;
int long il;
long int li;

2 dài:

long long ll;
int long long ill;
long int long lil;
long long int lli;

Ngoài ra nếu ở trên là đúng, các khai báo sau đây cũng giống hệt nhau?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;

8
Kiểm tra nó (mặc dù chỉ trên trình biên dịch của bạn) bằng cách sử dụng std::swap. Điều này sẽ không biên dịch nếu các loại không giống nhau.
Bathsheba


24
Bình chọn để mở lại. Các bản sao bị cáo buộc có liên quan nhưng nó không phải là câu hỏi này. Câu trả lời ở đó không trả lời câu hỏi này. Những người bỏ phiếu kín: xin đừng bỏ phiếu để đóng trên cơ sở thiếu hiểu biết.
Chúc mừng và hth. - Alf


So sánh sizeof () mỗi cái để chắc chắn. Độ dài dài phải là 64 bit, vì vậy sizeof (l) phải là 8, nếu sizeof (ill) == sizeof (lil) thì trình biên dịch của bạn sẽ thấy chúng giống nhau. Đây sẽ là đúng đối với trình biên dịch hiện tại của bạn và bất kỳ trình biên dịch tương lai mà bạn có thể gặp phải (cho đến khi sự sụp đổ của sizeof () - mà hy vọng sẽ không bao giờ hay tôi đã có một nghiêm trọng số lượng viết lại để làm).
Michael Promotionson

Câu trả lời:


136

Theo Tiêu chuẩn C ++ (7.1.6.2 Trình xác định loại đơn giản)

3 Khi cho phép nhiều bộ xác định kiểu đơn giản, chúng có thể được trộn lẫn tự do với các bộ xác định từ chối khác theo bất kỳ thứ tự nào.

Vì vậy, ví dụ khai báo sau là hợp lệ

long static long const int x = 10;

Bạn thậm chí có thể sử dụng constexprspecifier cùng với constvòng loại. Ví dụ

constexpr long static long const int x = 10;

Nhân tiện, chúng tôi quên mất specifier signed! Hãy thêm nó vào ví dụ trước khi khai báox

constexpr long static long const int signed x = 10;

Trong C, bạn cũng có thể sử dụng một số loại vòng loại trong cùng trình tự xác định khai báo. Theo tiêu chuẩn C (vòng loại 6.7.3)

5 Nếu cùng một vòng loại xuất hiện nhiều hơn một lần trong cùng một danh sách trình định danh cụ thể, trực tiếp hoặc thông qua một hoặc nhiều typedefs, thì hành vi đó giống như khi nó chỉ xuất hiện một lần ....

Vì vậy, ví dụ trong C khai báo sau cũng hợp lệ

const long const long static const int const signed x = 10;

Vì vậy, nếu bạn được trả tiền theo số lượng ký hiệu được nhập trong chương trình thì tôi khuyên bạn nên sử dụng các khai báo đó. :)


96
Khi bạn hoàn toàn, tích cực phải chắc chắn giá trị sẽ không bao giờ thay đổi.
Bob

3
@hvd Thật không may, bình luận thường được loại trừ khỏi tính toán như vậy.
Vlad từ Moscow

9
Ngay cả khi được viết như thế #define REM(...), và sau đó là một ví dụ về số lượng từ khổng lồ , i++; REM(Here, we increment i to make sure the new value of i is one more than the old value of i. This is safe because we know the value of i is less than the maximum value of i's type.)?


15
Bạn thậm chí không phải xen kẽ các vòng loại ... const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const answer = 42;biên dịch tốt trong C :-)
Lucas Trzesniewski

111

Là loại giống hệt ...

Đúng.

C ++ 11 §7.1.6.2 / 3

Khi có nhiều đơn giản-type-specifier s được cho phép, họ có thể được tự do trộn lẫn với khác decl-specifiers trong bất kỳ thứ tự.


2
Cú sút thẳng. +1.
einpoklum

42

Có, nhưng xin đừng . Giống như tiếng Anh và tiếng Đức có các trật tự từ thông thường cho tính từ và trạng từ (ví dụ: thời gian - cách thức - địa điểm), C và C ++ cũng vậy. Thay đổi từ thứ tự thông thường sẽ không gây nhầm lẫn cho trình biên dịch, nhưng nó sẽ gây nhầm lẫn cho các nhà phát triển đồng nghiệp của bạn. Tôi muốn đề xuất rằng thứ tự thông thường là khoảng dọc theo dòng

  1. static/ extern(liên kết)
  2. const/ volatile(sửa đổi)
  3. signed/ unsigned(chữ ký)
  4. short/ long(chiều dài)
  5. Loại cơ bản (danh từ đứng đầu)

mặc dù chắc chắn có một số phòng ngọ nguậy.


29

Có phải lâu dài không có thời gian dài hay không?

Tất cả các câu trả lời khác ở đây đã nói về phần thứ hai của câu hỏi của bạn. Đối với phần đầu tiên: Is long long long = = long long int int? , câu trả lời là .

C ++ 11 7.1.6.2 Trình xác định loại đơn giản (bảng 10)

Specifier(s)            Type
...                     ...
long long int           long long int
long long               long long int
long int                long int
long                    long int  
...                     ...  

Đối với phần thứ hai của câu hỏi của bạn: Có phải là long long int long Nhận thức hay không? , câu trả lời là có một lần nữa.

Các bộ xác định kiểu có thể xảy ra theo bất kỳ thứ tự nào và có thể được trộn lẫn với các bộ xác định khai báo khác. Do đó, tất cả những điều sau đây

long long  
long long int  
long int long  
int long long  

có giá trị và tương đương.


3
Tôi không hiểu lý do tại sao bạn không cải thiện @Cheers và hth. - Alf trả lời thay.
Sebastian Mach

8
@phresnel; Bởi vì tất cả các câu trả lời khác chỉ bao gồm một nửa. Tất cả đề cập đến sự xen kẽ của bộ xác định định dạng thiếu nửa đầu câu hỏi trong tiêu đề: Có phải long long Khăn = Long long int int = = long long int long
haccks

5
@phresnel Một số người trả lời cho việc khuyến khích đạt được đại diện. Chỉnh sửa câu trả lời của người khác để trả lời cho nửa kia một câu trả lời là rất nhiều công việc để cung cấp tín dụng cho người khác một cách hiệu quả.

1
Thật. Lúc đầu, điều này xuất hiện như chỉ là một bổ sung nhỏ. (CC: @Thebluefish)
Sebastian Mach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.