Tôi có thể xác định độ dài của một mảng bằng hằng số, vậy tại sao int d [b] không hoạt động?


11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

Định nghĩa của f[c]là hợp lệ.
Biến bcũng là một hằng số int, nhưng trình biên dịch đã cho tôi lỗi "biểu thức phải có giá trị không đổi" cho dòng int d[b]. Sự khác biệt giữa bvà là cgì?

Câu trả lời:


16

sự khác biệt giữa b và c là gì?

c có bộ khởi tạo hằng số thời gian biên dịch, trong khi b thì không. Một đối tượng const với bộ khởi tạo hằng số thời gian biên dịch tự nó là một giá trị hằng số thời gian biên dịch.

Vì tôi có thể định nghĩa một phần mười của một arry bằng cách sử dụng hằng số, vậy tại sao điều này không hoạt động?

Không chỉ bất kỳ hằng số sẽ làm. constvòng loại ngụ ý hằng số thời gian chạy (nghĩa là giá trị có thể được xác định trong thời gian chạy nhưng sẽ không thay đổi trong suốt vòng đời của đối tượng). Chỉ biên dịch giá trị hằng số thời gian có thể được sử dụng như kích thước mảng.


6

Bạn đang sử dụng một biến không liên tục để gán giá trị cho hằng số. Do đó, giá trị của biến mà không xác định được thời gian biên dịch . Tôi biết bạn không thay đổi a, nhưng trình biên dịch không nghĩ như thế này.


4

Chẩn đoán trình biên dịch nên thực sự được biên dịch biểu thức hằng số đánh giá thời gian .

Kể từ khi đối tượng ban đầu mà bđược gán không phải là const, bkhông phải là một thời gian biên dịch biểu thức hằng thể đánh giá được, vì vậy biên soạn sẽ thất bại như mảng chiều dài thay đổi không được hỗ trợ trong tiêu chuẩn C ++.


1

"Const" chỉ có nghĩa là biến sẽ không thay đổi trong thời gian chạy và không có nghĩa là giá trị của nó có thể được suy ra khi biên dịch.

Tôi đoán những gì bạn đang tìm kiếm là "constexpr". Có lẽ bạn có thể thử nó như thế này:

constexpr int b = 4; // can't be assigned from a!
int d[b];

Thay vào đó, "constexpr" có nghĩa là "const thực" và "const" chỉ có nghĩa là "var không thay đổi", bởi vì một số lý do lịch sử. Cần phải nhớ rằng một mảng riêng trong c ++ luôn có độ dài cố định như @Bathsheba nói.


Bạn đang nói về "ngôn ngữ khác" là gì?
Brian

1
@Brian Xin lỗi, nó không liên quan. Tôi đã thay đổi câu trả lời của tôi.
Leon

"Không có scotsman thực sự ..." - thay vào đó, hãy để tôi không đồng ý với "constexpr" của bạn có nghĩa là "const const" và "const" chỉ có nghĩa là câu lệnh "var không thay đổi" . "const" có nghĩa là "const", "constexpr" có nghĩa là "constexpr" - chúng có hai ý nghĩa và ý nghĩa riêng biệt trong ngữ cảnh của ngôn ngữ c ++. "const" có nghĩa là "Không thể sửa đổi đối tượng" , "constexpr" có nghĩa là "có thể đánh giá giá trị của hàm hoặc biến tại thời điểm biên dịch"
CharonX

Xin lỗi, có lẽ tôi đã thể hiện nó không chính xác. Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi.
Leon

1

Thuật ngữ "hằng số" thực sự mơ hồ và từ khóa constgây hiểu nhầm.

constcó nghĩa là: "không cho phép giá trị của đối tượng này sẽ không bị thay đổi sau khi khởi tạo". Nó không có nghĩa là "hằng số thời gian biên dịch". Giá trị ban đầu của nó có thể (và thường không) vẫn đến từ các nguồn thời gian chạy.

Bạn cần một hằng số thời gian biên dịch cho một mảng bị ràng buộc.

Đôi khi có thể có một đối tượng có tên foolà hằng số thời gian biên dịch, nếu có const nó được khởi tạo từ một biểu thức không đổi, như một nghĩa đen hoặc một constexprvật. Đó là trường hợp cho c; nó không phải là trường hợp cho b.

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.