Trong tin học, hằng số là một đại lượng?

Hằng được dùng trong lập trình để lưu trữ dữ liệu vì nội dung của nó luôn cố định và giữ nguyên trong suốt chương trình

Dữ liệu được lưu trữ trong một biến hoặc biến [biến] có thể thay đổi khi chương trình đang chạy

 

2. Minh họa về biến và hằng

2. 1. Ví dụ về hằng số

Chúng tôi xác định một hằng số có tên SITE _ DOMAIN trong ví dụ bên dưới

Trong trường hợp này, bạn có thể sử dụng TEMP _ FOLDER nhưng không thay đổi giá trị của nó

Lưu ý rằng mặc dù tên hằng thường được viết hoa trong ngôn ngữ lập trình, bạn cũng có thể sử dụng chữ thường

Ngoài cú pháp nêu trên, bạn cũng có thể sử dụng macro trong C để khai báo một hằng

 

2. 2. Ví dụ về biến

Trong ví dụ bên dưới, chúng ta định nghĩa một biến có tên là year với kiểu dữ liệu là int

Như bạn có thể thấy từ ví dụ trên, giá trị của biến năm có thể thay đổi trong khi chương trình đang chạy

 

3. Kiểu dữ liệu của biến

Trong một số ngôn ngữ lập trình, chẳng hạn như C, chúng ta cần chỉ định kiểu dữ liệu cho biến khi khai báo biến. Dữ liệu trong lập trình được chia thành nhiều kiểu khác nhau như kiểu số [gồm số nguyên], kiểu chuỗi [gồm các xâu kí tự], kiểu float gồm số thực. Để minh họa, biến năm sau được chỉ định là có kiểu dữ liệu số nguyên

Khi kiểu dữ liệu của một biến được khai báo, trình biên dịch C có thể xác định dung lượng bộ nhớ RAM sẽ cần được đăng ký để lưu trữ giá trị của biến, ví dụ: 2 hoặc 2 sẽ được yêu cầu

Các ngôn ngữ yêu cầu định nghĩa kiểu dữ liệu của biến khi khai báo như trên còn được gọi là ngôn ngữ gõ tĩnh

Các ngôn ngữ lập trình khác như PHP hay Ruby không yêu cầu lập trình viên khai báo kiểu dữ liệu cho biến vì trình thông dịch của trình biên dịch sẽ gán dữ liệu bộ nhớ cho biến dựa trên giá trị mà biến chứa.

Ngôn ngữ gõ động hay còn gọi là ngôn ngữ gõ động là ngôn ngữ hỗ trợ tính năng không yêu cầu định nghĩa kiểu dữ liệu cho biến này

 

4. ngôn ngữ động

Khi hầu hết các thử nghiệm được thực hiện tại thời điểm biên dịch trái ngược với thời gian biên dịch, ngôn ngữ lập trình được cho là được nhập động hoặc chỉ là "động. " Các loại được liên kết với các giá trị không thay đổi trong kiểu nhập động. Đối với các loại do người dùng định nghĩa nhưng không phải là các loại tích hợp sẵn, các ngôn ngữ được nhập bao gồm Groovy, JavaScript, Lisp, Lua và Objective-C. So với gõ tĩnh, gõ động có thể linh hoạt hơn, ví dụ, bằng cách cho phép các chương trình tạo các loại và chức năng dựa trên dữ liệu thời gian chạy, mặc dù phải trả giá bằng một bảo đảm tiên nghiệm. Điều này khiến một số chương trình có thể bị hiển thị không hợp lệ

Nhập động có thể dẫn đến lỗi loại thời gian chạy, trong đó một giá trị có thể có loại không mong muốn trong thời gian chạy và một thao tác vô nghĩa có thể được áp dụng cho loại đó, thường rất lâu sau khi xảy ra lỗi lập trình, chẳng hạn như khi loại dữ liệu không chính xác được truyền vào vị trí của nó. . Điều này gây khó khăn cho việc tìm ra lỗi

Các hệ thống ngôn ngữ được nhập động thực hiện ít kiểm tra "thời gian dịch" hơn trên mã nguồn so với các hệ thống ngôn ngữ được nhập tĩnh của chúng [chẳng hạn như kiểm tra xem chương trình có đúng về mặt cú pháp không]. Các thử nghiệm thời gian thực có khả năng phức tạp hơn vì chúng có thể sử dụng cả thông tin động và bất kỳ thông tin nào có trong quá trình dịch. Mặt khác, kiểm tra thời gian chạy chỉ xác nhận rằng các điều kiện giữ áp dụng cho một lần thực thi chương trình cụ thể và nó được lặp lại cho mỗi lần thực hiện chương trình.

Các kỹ thuật lập trình như kiểm tra đơn vị, rất quan trọng trong phát triển phần mềm chuyên nghiệp và thậm chí còn quan trọng hơn trong các ngôn ngữ được nhập động, thường giúp phát triển các ngôn ngữ được nhập động. Trên thực tế, việc kiểm tra được thực hiện để đảm bảo chương trình hoạt động bình thường có thể bắt được nhiều loại lỗi hơn nhiều so với kiểm tra kiểu tĩnh, nhưng mặt khác, nó không thể tìm kiếm lỗi một cách triệt để đồng thời kiểm tra lỗi. Có thể kết hợp kiểm thử vào quy trình phát triển phần mềm, trong trường hợp đó có thể gọi là kiểm thử "thời gian biên dịch", trong đó

Kiểu gõ được tính toán, được sử dụng khi kiểm tra được thực hiện tại thời điểm biên dịch thay vì thời gian chạy, ngược lại với kiểu gõ động. Các ngôn ngữ có kiểu gõ tĩnh, như Ada, C, C++, C#, Java, v.v. , liên kết các loại với các biến thay vì giá trị. Nhập tĩnh là một hình thức xác minh chương trình hạn chế [xem an toàn loại] đối với các phân biệt vô hướng, mảng, hàm băm và chương trình con. Trình kiểm tra kiểu tĩnh chỉ đánh giá thông tin kiểu có thể được xác định tại thời điểm biên dịch, nhưng có thể xác nhận rằng các điều kiện kiểm tra phù hợp với tất cả các lần thực thi khả thi của chương trình, do đó loại bỏ nhiều lỗi kiểu khỏi chu trình phát triển. Có thể bỏ qua kiểm tra loại thời gian chạy để ưu tiên cho các tối ưu hóa khác, có thể tăng tốc và sử dụng ít bộ nhớ hơn trong quá trình thực thi chương trình

Trình kiểm tra kiểu tĩnh không dùng nữa một số chương trình có thể hoạt động tốt trong thời gian chạy nhưng không thể xác định tĩnh là được gõ tốt vì chúng đánh giá thông tin kiểu trong quá trình biên dịch và do đó thiếu thông tin kiểu chỉ khả dụng trong thời gian chạy. Chẳng hạn, nếu một chương trình mã chứa một biểu thức luôn có giá trị đúng trong thời gian chạy

bởi vì ngay cả phân chia tĩnh cũng không thể đảm bảo rằng một nhánh khác sẽ không được lấy, sẽ bị từ chối khi nhập sai. Hành vi bảo thủ của trình kiểm tra tĩnh có lợi cho việc đánh giá sai không thường xuyên. Nếu không kiểm tra kiểu tĩnh, thậm chí kiểm tra phạm vi mã với phạm vi mã 100% có thể không tìm thấy các lỗi kiểu như vậy, ngay cả trong các đường dẫn mã không được sử dụng thường xuyên. Bởi vì tất cả các vị trí nơi các giá trị được tạo ra và tất cả các vị trí nơi một giá trị nhất định được sử dụng phải được xem xét, kiểm tra phạm vi mã có thể không phát hiện ra các lỗi loại đó

Do có "lỗ hổng" trong đặc tả ngôn ngữ lập trình, các ngôn ngữ gõ tĩnh phổ biến nhất không phải là kiểu chính thức an toàn, cho phép các lập trình viên viết mã tránh được sự xác minh do trình kiểm tra kiểu tĩnh thực hiện và do đó giải quyết được nhiều vấn đề.  

Xin chân thành cảm ơn quý khách hàng đã đọc bài viết này của Luật Minh Khuê về chủ đề liên quan trong tin học hằng và biến có phải là đại lượng không?

Trong lập trình máy tính, hằng số là một giá trị mà chương trình không được thay đổi trong quá trình thực thi bình thường, tức là. e. , giá trị không đổi. Khi được liên kết với một mã định danh, một hằng số được gọi là "được đặt tên", mặc dù các thuật ngữ "hằng số" và "hằng số được đặt tên" thường được sử dụng thay thế cho nhau. Điều này trái ngược với một biến, là một định danh có giá trị có thể thay đổi trong quá trình thực thi bình thường, i. e. , giá trị là biến

Các hằng hữu ích cho cả lập trình viên và trình biên dịch. Đối với các lập trình viên, chúng là một dạng mã tự viết tài liệu và cho phép suy luận về tính chính xác, trong khi đối với trình biên dịch, chúng cho phép kiểm tra thời gian biên dịch và thời gian chạy để xác minh rằng các giả định về hằng số không bị vi phạm và cho phép hoặc đơn giản hóa một số tối ưu hóa trình biên dịch

Có nhiều nhận thức cụ thể khác nhau về khái niệm chung về một hằng số, với những khác biệt tinh tế thường bị bỏ qua. Đáng kể nhất là. hằng số thời gian biên dịch [có giá trị tĩnh], hằng số thời gian chạy [có giá trị động], đối tượng không thay đổi và loại hằng số [const]

Các ví dụ điển hình về hằng số thời gian biên dịch bao gồm hằng số toán học, giá trị từ các tiêu chuẩn [ở đây là đơn vị truyền tối đa] hoặc giá trị cấu hình bên trong [ở đây là ký tự trên mỗi dòng], chẳng hạn như các ví dụ C này

const float PI = 3.1415927;  // maximal single float precision
const unsigned int MTU = 1500;  // Ethernet v2, RFC 894
const unsigned int COLUMNS = 80;

Các ví dụ điển hình về hằng số thời gian chạy là các giá trị được tính toán dựa trên đầu vào của hàm, chẳng hạn như ví dụ C++ này

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}

Một số ngôn ngữ lập trình phân biệt rõ ràng về mặt cú pháp giữa các ký hiệu hằng và biến, ví dụ coi việc gán cho một hằng số là một lỗi cú pháp, trong khi ở các ngôn ngữ khác, chúng được coi là giống nhau về mặt cú pháp [cả hai chỉ đơn giản là một mã định danh] và sự khác biệt trong cách xử lý là

Giá trị hằng được xác định một lần và có thể được tham chiếu nhiều lần trong suốt chương trình. Sử dụng một hằng số thay vì chỉ định cùng một giá trị nhiều lần có thể đơn giản hóa việc bảo trì mã [như không lặp lại chính bạn] và có thể tự ghi lại bằng cách cung cấp một tên có ý nghĩa cho một giá trị, ví dụ:

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
1 thay vì 3. 1415926

So sánh với chữ và macro[sửa | sửa mã nguồn]

Có một số cách chính để thể hiện một giá trị dữ liệu không thay đổi trong quá trình thực thi chương trình, nhất quán trên nhiều ngôn ngữ lập trình. Một cách rất cơ bản là chỉ cần viết một số, ký tự hoặc chuỗi bằng chữ vào mã chương trình, đơn giản bằng C, C++ và các ngôn ngữ tương tự

Trong hợp ngữ, các số và ký tự bằng chữ được thực hiện bằng cách sử dụng các hướng dẫn "chế độ ngay lập tức" có sẵn trên hầu hết các bộ vi xử lý. Tên "ngay lập tức" xuất phát từ các giá trị có sẵn ngay lập tức từ luồng hướng dẫn, trái ngược với việc tải chúng gián tiếp bằng cách tra cứu địa chỉ bộ nhớ. Mặt khác, các giá trị dài hơn độ dài từ của bộ vi xử lý, chẳng hạn như chuỗi và mảng, được xử lý gián tiếp và trình hợp dịch thường cung cấp giả hành "dữ liệu" để nhúng các bảng dữ liệu đó vào chương trình

Một cách khác là xác định một macro tượng trưng. Nhiều ngôn ngữ lập trình cấp cao và nhiều trình biên dịch chương trình hợp ngữ cung cấp tiện ích macro nơi lập trình viên có thể định nghĩa, thường ở phần đầu của tệp nguồn hoặc trong tệp định nghĩa riêng, tên cho các giá trị khác nhau. Sau đó, một bộ tiền xử lý sẽ thay thế các tên này bằng các giá trị thích hợp trước khi biên dịch, dẫn đến một thứ giống hệt về mặt chức năng với việc sử dụng các chữ cái, với lợi thế về tốc độ của chế độ ngay lập tức. Bởi vì có thể khó duy trì mã trong đó tất cả các giá trị được viết theo nghĩa đen, nếu một giá trị được sử dụng theo bất kỳ cách lặp lại hoặc không rõ ràng nào, thì nó thường được thực hiện dưới dạng macro

Cách thứ ba là khai báo và định nghĩa một biến là "hằng số". Một biến toàn cục hoặc biến tĩnh có thể được khai báo [hoặc một ký hiệu được xác định trong hợp ngữ] với một từ khóa hạn định như

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2,
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
3 hoặc
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4, nghĩa là giá trị của nó sẽ được đặt tại thời điểm biên dịch và không thể thay đổi được trong thời gian chạy. Trình biên dịch thường đặt các hằng số tĩnh trong phần văn bản của tệp đối tượng cùng với mã, trái ngược với phần dữ liệu nơi lưu giữ dữ liệu khởi tạo không phải hằng số. Một số trình biên dịch có thể tạo một phần dành riêng cho hằng số. Bảo vệ bộ nhớ có thể được áp dụng cho khu vực này để ngăn việc ghi đè các hằng số đó bằng các con trỏ sai

Những hằng số này khác với chữ theo một số cách. Trình biên dịch thường đặt một hằng số trong một vị trí bộ nhớ duy nhất được xác định bằng ký hiệu, thay vì trải rộng khắp tệp thực thi như với macro. Mặc dù điều này ngăn cản lợi thế về tốc độ của chế độ ngay lập tức, nhưng có lợi thế về hiệu quả bộ nhớ và trình gỡ lỗi có thể hoạt động với các hằng số này trong thời gian chạy. Ngoài ra, trong khi các macro có thể vô tình được xác định lại do xung đột các tệp tiêu đề trong C và C++, các hằng số xung đột được phát hiện tại thời điểm biên dịch

Tùy thuộc vào ngôn ngữ, các hằng số có thể được loại bỏ hoặc loại. Trong C và C++, macro cung cấp cái trước, trong khi

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 cung cấp cái sau

#define PI 3.1415926535

const float pi2 = 3.1415926535;

trong khi ở Ada, có các loại số phổ quát có thể được sử dụng, nếu muốn

________số 8

với biến thể chưa nhập được chuyển đổi hoàn toàn thành loại thích hợp sau mỗi lần sử dụng

Hằng số có giá trị động[sửa]

Bên cạnh các hằng số tĩnh được mô tả ở trên, nhiều ngôn ngữ thủ tục như Ada và C++ mở rộng khái niệm hằng số đối với các biến toàn cục được tạo tại thời điểm khởi tạo, các biến cục bộ được tạo tự động trong thời gian chạy trên ngăn xếp hoặc trong các thanh ghi, tới bộ nhớ được cấp phát động.

Các hằng số có giá trị động không chỉ định một biến nằm trong một vùng bộ nhớ cụ thể, cũng như các giá trị được đặt tại thời điểm biên dịch. Trong mã C++ chẳng hạn như

float func[const float ANYTHING] {
    const float XYZ = someGlobalVariable*someOtherFunction[ANYTHING];
    ...
}

biểu thức mà hằng số được khởi tạo không phải là hằng số. Việc sử dụng hằng số là không cần thiết ở đây đối với tính hợp pháp của chương trình hoặc tính chính xác về ngữ nghĩa, nhưng có ba ưu điểm

  1. Người đọc rõ ràng rằng đối tượng sẽ không bị sửa đổi thêm nữa, sau khi đã đặt
  2. Mọi cố gắng thay đổi giá trị của đối tượng [của những người lập trình sau này chưa hiểu hết logic chương trình] sẽ bị trình biên dịch từ chối
  3. Trình biên dịch có thể thực hiện tối ưu hóa mã khi biết rằng giá trị của đối tượng sẽ không thay đổi sau khi được tạo

Các hằng số có giá trị động bắt nguồn từ một tính năng ngôn ngữ với ALGOL 68. Các nghiên cứu về mã Ada và C++ đã chỉ ra rằng các hằng số có giá trị động không được sử dụng thường xuyên, điển hình cho 1% đối tượng hoặc ít hơn, khi chúng có thể được sử dụng nhiều hơn, vì khoảng 40–50% đối tượng cục bộ, không thuộc lớp thực sự bất biến một lần . Mặt khác, những "biến bất biến" như vậy có xu hướng trở thành mặc định trong các ngôn ngữ chức năng vì chúng ưu tiên các kiểu lập trình không có tác dụng phụ [e. g. , đệ quy] hoặc đặt hầu hết các khai báo thành bất biến theo mặc định, chẳng hạn như ML. Các ngôn ngữ chức năng thuần túy thậm chí cấm hoàn toàn các tác dụng phụ

Hằng số thường được sử dụng trong khai báo hàm, như một lời hứa rằng khi một đối tượng được truyền theo tham chiếu, hàm được gọi sẽ không thay đổi nó. Tùy thuộc vào cú pháp, một con trỏ hoặc đối tượng được trỏ tới có thể là hằng số, tuy nhiên thông thường thì cái sau được mong muốn. Đặc biệt là trong C++ và C, nguyên tắc đảm bảo rằng các cấu trúc dữ liệu phù hợp không đổi trong suốt chương trình được gọi là tính chính xác của const

Tham số hàm hằng[sửa]

Trong C/C++, có thể khai báo tham số của hàm hoặc phương thức là hằng số. Đây là sự đảm bảo rằng tham số này không thể được sửa đổi sau lần gán đầu tiên [vô tình]. Nếu tham số là loại được xác định trước [tích hợp sẵn], nó được gọi theo giá trị và không thể sửa đổi. Nếu là kiểu do người dùng định nghĩa thì biến là địa chỉ con trỏ, cũng không sửa được. Tuy nhiên, nội dung của đối tượng có thể được sửa đổi không giới hạn. Khai báo tham số dưới dạng hằng số có thể là một cách để báo hiệu rằng giá trị này không nên thay đổi, nhưng lập trình viên phải ghi nhớ rằng trình biên dịch không thể thực hiện việc kiểm tra về việc sửa đổi một đối tượng.

Ngoài tính năng này, trong C++ còn có thể khai báo một hàm hoặc phương thức là

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2. Điều này ngăn các hàm hoặc phương thức đó sửa đổi bất kỳ thứ gì ngoại trừ các biến cục bộ

Trong C#, từ khóa

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 tồn tại, nhưng không có tác dụng tương tự đối với các tham số chức năng, như trường hợp trong C/C++. Tuy nhiên, có một cách để "khuấy động" trình biên dịch để thực hiện việc kiểm tra, mặc dù nó hơi phức tạp một chút.

Để có được hiệu ứng tương tự, trước tiên, hai giao diện được xác định

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2

Sau đó, các phương thức được xác định sẽ chọn giao diện phù hợp với khả năng chỉ đọc hoặc đọc/ghi

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
3

Hằng hướng đối tượng[sửa]

Một cấu trúc dữ liệu hoặc đối tượng không đổi được gọi là "bất biến" theo cách nói hướng đối tượng. Một đối tượng là bất biến mang lại một số lợi thế trong thiết kế chương trình. Chẳng hạn, nó có thể được "sao chép" đơn giản bằng cách sao chép con trỏ hoặc tham chiếu của nó, tránh thao tác sao chép tốn thời gian và tiết kiệm bộ nhớ

Các ngôn ngữ hướng đối tượng như C++ mở rộng tính không đổi hơn nữa. Các thành viên riêng lẻ của một cấu trúc hoặc lớp có thể được tạo const ngay cả khi lớp không phải là. Ngược lại, từ khóa

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
8 cho phép thay đổi thành viên lớp ngay cả khi một đối tượng được khởi tạo là
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2

Ngay cả các chức năng có thể là const trong C++. Ý nghĩa ở đây là chỉ một hàm const có thể được gọi cho một đối tượng được khởi tạo là const;

C# có cả từ hạn định

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 và
#define PI 3.1415926535

const float pi2 = 3.1415926535;
1;

Java có một vòng loại gọi là

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 để ngăn việc thay đổi một tham chiếu và đảm bảo rằng nó sẽ không bao giờ trỏ đến một đối tượng khác. Điều này không ngăn các thay đổi đối với chính đối tượng được giới thiệu. Java's
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 về cơ bản tương đương với một con trỏ
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 trong C++. Nó không cung cấp các tính năng khác của
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2

Trong Java, từ hạn định

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 nói rằng thành viên hoặc biến dữ liệu bị ảnh hưởng không thể gán được, như bên dưới

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
3

Nó phải được trình biên dịch quyết định khi biến có dấu

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 được khởi tạo và nó chỉ được thực hiện một lần, nếu không lớp sẽ không biên dịch được. Các từ khóa
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 của Java và
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 của C++ có cùng ý nghĩa khi được áp dụng với các biến nguyên thủy

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
7

Xem xét các con trỏ, một tham chiếu

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 trong Java có nghĩa tương tự như con trỏ
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 trong C++. Trong C++, người ta có thể khai báo một "kiểu con trỏ không đổi"

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
0

Ở đây,

pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;
2 phải được khởi tạo tại thời điểm khai báo và không thể thay đổi lại, nhưng những gì nó chỉ ra thì có thể sửa đổi. Tôi. e.
pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;
3 là hợp lệ. Nó không thể trỏ đến một vị trí khác. Các tham chiếu cuối cùng trong Java hoạt động theo cùng một cách ngoại trừ việc chúng có thể được khai báo chưa được khởi tạo

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
0

Ghi chú. Java không hỗ trợ con trỏ. Đó là bởi vì [có hạn chế] là cách truy cập đối tượng mặc định trong Java và Java không sử dụng dấu sao để biểu thị chúng. Ví dụ: i trong ví dụ trước là một con trỏ và có thể được sử dụng để truy cập thể hiện

Người ta cũng có thể khai báo một con trỏ tới dữ liệu "chỉ đọc" trong C++

Ở đây

pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;
2 có thể được sửa đổi để chỉ bất cứ thứ gì, bất cứ lúc nào;

Không có cơ chế tương đương trong Java. Do đó, cũng không có phương pháp

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 nào. Không thể thực thi tính chính xác của hằng số trong Java, mặc dù bằng cách sử dụng các giao diện và xác định giao diện chỉ đọc cho lớp và chuyển giao diện này xung quanh, người ta có thể đảm bảo rằng các đối tượng có thể được truyền qua hệ thống theo cách mà chúng không thể bị sửa đổi

Khung bộ sưu tập Java cung cấp một cách để tạo trình bao bọc bất biến của

pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;
7 đến
pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;
8 và các phương thức tương tự

Một phương thức trong Java có thể được khai báo là "cuối cùng", nghĩa là nó không thể bị ghi đè trong các lớp con

Trong C#, từ hạn định

#define PI 3.1415926535

const float pi2 = 3.1415926535;
1 có tác dụng tương tự đối với các thành viên dữ liệu như
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 trong Java và
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2 trong C++; . Hiệu ứng ức chế kế thừa khác của Java
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
4 khi được áp dụng cho các phương thức và lớp được tạo ra trong C# với sự trợ giúp của từ khóa
float func[const float ANYTHING] {
    const float XYZ = someGlobalVariable*someOtherFunction[ANYTHING];
    ...
}
5

Không giống như C++, C# không cho phép các phương thức và tham số được đánh dấu là

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
2. Tuy nhiên, người ta cũng có thể vượt qua các lớp con chỉ đọc và. NET Framework cung cấp một số hỗ trợ để chuyển đổi các bộ sưu tập có thể thay đổi thành các bộ sưu tập không thay đổi có thể được chuyển dưới dạng trình bao bọc chỉ đọc

Theo mô hình [ chỉnh sửa ]

Việc xử lý các hằng số thay đổi đáng kể theo mô hình lập trình. Tính chính xác của hằng số là một vấn đề trong các ngôn ngữ mệnh lệnh như C++ bởi vì theo mặc định, các ràng buộc tên thường tạo ra các biến, các biến này có thể khác nhau, như tên gợi ý, và do đó, nếu một người muốn đánh dấu một ràng buộc là hằng số thì điều này yêu cầu một số dấu hiệu bổ sung. Trong các mô hình ngôn ngữ lập trình khác, các vấn đề liên quan đến phát sinh, với một số điểm tương tự đối với tính chính xác của hằng số được tìm thấy

Trong lập trình chức năng, dữ liệu thường là hằng số theo mặc định, thay vì biến theo mặc định. Thay vì gán một giá trị cho một biến [không gian lưu trữ có tên và giá trị có khả năng thay đổi], người ta tạo một liên kết tên với một giá trị, chẳng hạn như bằng cấu trúc

float func[const float ANYTHING] {
    const float XYZ = someGlobalVariable*someOtherFunction[ANYTHING];
    ...
}
7 trong nhiều phương ngữ của Lisp. Trong một số ngôn ngữ chức năng, đặc biệt là những ngôn ngữ đa mô hình như Common Lisp, việc sửa đổi dữ liệu là chuyện bình thường, trong khi ở những ngôn ngữ khác thì việc này bị tránh hoặc được coi là ngoại lệ; . dấu chấm than thu hút sự chú ý đến điều này. Theo mặc định, các ngôn ngữ như vậy đạt được các mục tiêu về tính đúng đắn của const, thu hút sự chú ý đến sự sửa đổi hơn là tính không đổi

Trong một số ngôn ngữ hướng đối tượng có khái niệm đối tượng bất biến, khái niệm này đặc biệt được sử dụng cho các kiểu cơ bản như chuỗi; . Các ngôn ngữ này khác nhau về việc liệu các loại do người dùng xác định có thể được đánh dấu là không thay đổi hay không và có thể cho phép các trường [thuộc tính] cụ thể của một đối tượng hoặc loại được đánh dấu là không thay đổi

Trong một số ngôn ngữ đa mô hình cho phép cả kiểu hướng đối tượng và kiểu chức năng, cả hai tính năng này có thể được kết hợp. Ví dụ: trong OCaml, các trường đối tượng là bất biến theo mặc định và phải được đánh dấu rõ ràng bằng từ khóa

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
8 để có thể thay đổi, trong khi ở Scala, các liên kết là bất biến rõ ràng khi được xác định bằng
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
20 cho "giá trị" và có thể thay đổi rõ ràng khi được xác định bằng
void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
21 cho "biến

Quy ước đặt tên[sửa]

Quy ước đặt tên cho các hằng khác nhau. Một số chỉ đơn giản đặt tên cho chúng giống như bất kỳ biến nào khác. Những người khác sử dụng chữ hoa và dấu gạch dưới cho các hằng số theo cách tương tự như cách sử dụng truyền thống của họ cho các macro tượng trưng, ​​chẳng hạn như

void f[std::string s] {
  const size_t l = s.length[];
  // ...
}
22. Trong ký hiệu tiếng Hungary, tiền tố "k" biểu thị các hằng số cũng như macro và kiểu liệt kê

Một quy ước bắt buộc là trong Ruby, bất kỳ biến nào bắt đầu bằng chữ in hoa đều được coi là hằng số, bao gồm cả tên lớp

Hằng số trong công nghệ thông tin là gì?

Hằng số là một phần bộ nhớ được đặt tên mà giá trị không thể thay đổi trong khi chương trình chạy . Các hằng hữu ích vì chúng được khai báo và gán một lần, nhưng có thể được gọi đi nhắc lại nhiều lần trong suốt chương trình.

Hằng số có ý nghĩa gì trong mã hóa?

Const [hằng số] trong lập trình là từ khóa xác định một biến hoặc con trỏ là không thể thay đổi . Một const có thể được áp dụng trong một khai báo đối tượng để chỉ ra rằng đối tượng, không giống như một biến tiêu chuẩn, không thay đổi. Các giá trị cố định như vậy cho các đối tượng thường được gọi là chữ.

Giá trị của một hằng số là gì?

Giá trị hằng số là giá trị cố định . Trong Đại số, hằng số là một số hoặc đôi khi nó được biểu thị bằng một chữ cái như a, b hoặc c cho một số cố định. Ví dụ x+2=10, ở đây 2 và 10 là hằng số.

Biến và hằng là gì?

Hằng số không thay đổi giá trị theo thời gian. Mặt khác, một biến thay đổi giá trị của nó tùy thuộc vào phương trình . Hằng số thường được viết bằng số. Các biến được viết đặc biệt bằng chữ cái hoặc ký hiệu. Các hằng số thường đại diện cho các giá trị đã biết trong một phương trình, biểu thức hoặc trong dòng lập trình.

Chủ Đề