Trình biên dịch Java có một số lượng nhỏ của logic dòng chảy để cho phép bạn initalise final
biến sau khi khai báo của họ.Đây là hợp pháp Java:
final int something;
if (today == Friday)
something = 7;
else
something = 42;
Java sẽ phát hiện nếu bất kỳ chi nhánh nào để giá trị cuối cùng không được xác định. Nó sẽ không phân tích các điều kiện, vì vậy đây không phải là hợp pháp Java, mặc dù nó là một cách logic tương tự:
final int something;
if (today == Friday)
something = 7;
if (today != Friday)
something = 42;
Trong ANSI C89, const
biến (trừ extern
) phải được khởi tạo trong tuyên bố họ được khai báo trong.
const int something = (today == Friday) ? 7 : 42;
các extern
sửa đổi trên một tuyên bố nói với trình biên dịch mà biến được khởi tạo trong một đơn vị complation khác nhau (hoặc ở nơi khác trong đơn vị biên dịch này).
Trong ANSI C99, bạn có thể trộn các khai báo và mã, để bạn có thể khai báo và khởi tạo biến số const
sau một khối xác nhận và mã. Tính di động của năm 1999 ANSI C vẫn là một vấn đề.
Một tác phẩm xung quanh cho C89 cần lưu ý rằng các quy tắc cho các tờ khai trước công việc mã ở phạm vi khối chứ không phải là phạm vi chức năng, vì vậy bạn có thể làm điều này:
#include<stdio.h>
int main (void)
{
printf ("wibble\n");
{
const int x = 10;
printf ("x = %d\n", x);
}
return 0;
}
Nguồn
2009-09-13 10:53:58
@Pete: 2x Bài học kinh nghiệm. –
Trên thực tế, bạn có thể khai báo các biến * global * const ngoài global mà không cần khởi tạo chúng. 'const int a;' được gọi là "định nghĩa dự kiến", hoặc một cái gì đó tương tự.Nếu biến sau đó được định nghĩa rõ ràng, thì nó được coi như một khai báo. Nếu không, đó là định nghĩa. Vì vậy, bạn có thể có 'const int a;' trong một tiêu đề, và sau đó 'const int a = 12;' trong tệp .c. Không phải là bạn thường muốn, vì bạn có nguy cơ quên định nghĩa và kết thúc với 'a' là 12 trong một số đơn vị biên dịch và 0 trong số khác ... –
@onebyone: Trên thực tế," định nghĩa dự kiến "không dẫn đến khác nhau giá trị trong các đơn vị biên dịch khác nhau. Thử biên dịch "int x;" trong một tệp và "int x = 1;" trong một cái khác. Biến x chứa 1 trong cả hai tệp sau khi liên kết (với tất cả các trình biên dịch mà tôi đã thử). Đây là hành vi được triển khai rộng rãi, mặc dù tôi không đọc C99 như chỉ định chính xác điều này. –