2010-06-01 83 views
23

Tôi vừa quay trở lại một chút về C học sử dụng cuốn sách Beginning C của Ivor Horton. Tôi đã nhận được chút ít về tuyên bố các hằng số mà dường như được trộn lẫn với các biến trong cùng một câu.Tại sao sử dụng hằng số trong lập trình?

Chỉ cần làm rõ, sự khác nhau trong việc xác định hằng số và biến trong C là gì và khi nào bạn cần sử dụng hằng số thay vì biến? Tôi biết folks nói để sử dụng một hằng số khi thông tin không thay đổi trong quá trình thực hiện chương trình nhưng tôi không thể thực sự nghĩ về một thời gian khi một biến không thể được sử dụng thay thế.

+0

chiều dài cố định s bộ nhớ trường hợp xấu nhất sao chép vào mảng mới hoạt động –

+0

Câu hỏi này chỉ yêu cầu một ví dụ phản đối: tại sao bạn sẽ biến PI thành một biến? –

+0

@Hans Passant: Bạn có chắc Pi là hằng số không? Cho đến nay nó chỉ được đo ở gần Trái Đất. Bạn có chắc nó liên tục trong suốt thời gian không-thời gian? –

Trả lời

29

Biến, như bạn có thể đoán từ tên, thay đổi theo thời gian. Nếu nó không thay đổi, có "không mất". Khi bạn nói với trình biên dịch rằng giá trị sẽ không thay đổi, trình biên dịch có thể thực hiện một loạt các tối ưu hóa, như trực tiếp nội tuyến giá trị và không bao giờ phân bổ bất kỳ không gian nào cho hằng số trên ngăn xếp.

Tuy nhiên, bạn không thể luôn dựa vào trình biên dịch đủ thông minh để có thể xác định chính xác liệu giá trị có thay đổi sau khi được đặt hay không. Trong mọi tình huống mà trình biên dịch không có khả năng xác định điều này với độ tin cậy 100%, trình biên dịch sẽ sai về mặt an toàn và giả sử nó có thể thay đổi. Điều này có thể dẫn đến các tác động hiệu suất khác nhau như tránh nội tuyến, không tối ưu hóa các vòng nhất định, tạo mã đối tượng không thân thiện với nhau.

Vì điều này, và vì khả năng đọc cũng rất quan trọng, nên cố gắng sử dụng hằng số rõ ràng bất cứ khi nào có thể và để biến cho những thứ thực sự có thể thay đổi.

Vì sao các hằng số được sử dụng thay cho các số theo nghĩa đen:

1) Làm cho mã dễ đọc hơn. Mọi người đều biết 3.14 là gì (hy vọng), không phải ai cũng biết rằng 3.07 là mức thuế thu nhập trong PA. Đây là một ví dụ về kiến ​​thức về miền cụ thể và không phải ai cũng duy trì mã của bạn trong tương lai (ví dụ: phần mềm thuế) sẽ biết điều đó.

2) Nó tiết kiệm công việc khi bạn thực hiện thay đổi. Đi và thay đổi mỗi 3,07 đến 3,18 nếu thuế suất thay đổi trong tương lai sẽ gây phiền nhiễu. Bạn luôn muốn giảm thiểu các thay đổi và lý tưởng thực hiện một thay đổi duy nhất. Những thay đổi đồng thời hơn bạn phải thực hiện, nguy cơ cao hơn mà bạn sẽ quên một cái gì đó, dẫn đến lỗi.

3) Bạn tránh được các lỗi nguy hiểm. Hãy tưởng tượng rằng có hai tiểu bang có thuế suất thuế thu nhập là 3,05, và sau đó một trong số đó thay đổi thành 3,18 trong khi tiểu bang khác ở mức 3,07. Bởi chỉ cần đi và thay thế, bạn có thể kết thúc với các lỗi nghiêm trọng. Tất nhiên, nhiều giá trị hằng số nguyên hoặc chuỗi thường phổ biến hơn "3.07". Ví dụ: số 7 có thể biểu thị số ngày trong tuần và một số ngày khác. Trong các chương trình lớn, rất khó để xác định ý nghĩa của từng giá trị theo nghĩa đen.

4) Trong trường hợp chuỗi văn bản, thông thường sử dụng tên biểu tượng cho chuỗi để cho phép các nhóm chuỗi thay đổi nhanh chóng trong trường hợp hỗ trợ nhiều ngôn ngữ.

Lưu ý rằng ngoài các biến và "biến số không đổi", cũng có một số ngôn ngữ có liệt kê. Một điều tra thực sự cho phép bạn định nghĩa một kiểu cho một nhóm nhỏ các hằng số (ví dụ, các giá trị trả về), do đó, sử dụng chúng sẽ cung cấp sự an toàn kiểu.

Ví dụ: nếu tôi có một điều tra cho các ngày trong tuần và trong các tháng, tôi sẽ được cảnh báo nếu tôi chỉ định một tháng vào một ngày. Nếu tôi chỉ sử dụng hằng số nguyên, sẽ không có cảnh báo khi ngày 3 được gán cho tháng 3. Bạn luôn muốn loại an toàn, và nó cải thiện khả năng đọc. Enumerations cũng tốt hơn để xác định thứ tự. Hãy tưởng tượng rằng bạn có hằng số cho những ngày trong tuần, và bây giờ bạn muốn tuần của bạn bắt đầu vào thứ hai thay vì chủ nhật.

+3

OP không hỏi về chữ. câu hỏi là tại sao BOTHER sử dụng hằng số khi mọi thứ không thay đổi ... tại sao KHÔNG chỉ sử dụng biến cho mọi thứ? nó không giống như chúng ta sẽ chạy ra ngoài ... –

+1

Tôi cảm thấy đoạn đầu tiên của câu trả lời của tôi trả lời rằng: không cần phải sử dụng một biến nếu nó không thay đổi theo thời gian. Nhưng tôi sẽ làm rõ hơn nữa. – Uri

+0

Tôi cũng sẽ thêm: 5) Loại an toàn. – matias

1

Từ khóa const thường được sử dụng cho các tham số chức năng, đặc biệt là con trỏ, để đề xuất bộ nhớ con trỏ trỏ tới sẽ không bị sửa đổi bởi hàm. Nhìn vào decleration cho strcpy ví dụ:

char *strcpy(char *dest, const char *src); 

Nếu không, ví dụ, một tuyên bố như

const int my_magic_no = 54321; 

có thể được ưa thích hơn:

#define MY_MAGIC_NO 54321 

vì lý do an toàn loại.

+0

Uhh, chỉ cần nhận ra tôi không thực sự giải quyết các câu hỏi tại sao sử dụng hằng số trên các biến. –

+0

Tôi không nghĩ rằng OP không hỏi về các tham số, mà thay vào đó là các biến cục bộ ... –

+0

Cảm ơn Brian vì đã chỉ ra điều đó. Giống như tôi đã không nhận thấy; –

9

Đối với một, tối ưu hóa hiệu suất.

Quan trọng hơn, điều này là dành cho người đọc của con người. Hãy nhớ rằng đối tượng mục tiêu của bạn không chỉ là trình biên dịch. Nó giúp thể hiện chính mình bằng mã và tránh nhận xét.

const int spaceTimeDimensions = 4; 

if(gpsSattelitesAvailable >= spaceTimeDimensions) 
    Good(); 
+2

OP thực sự không thực sự hỏi về hằng số so với chữ cái ... nhưng hằng số so với biến số ... –

+0

Tuy nhiên, nó là một công cụ dễ đọc. –

1

Hằng số là khi bạn chỉ muốn chia sẻ bộ nhớ và không thay đổi.

+3

Khi bạn muốn chia sẻ bộ nhớ, bạn sẽ làm tan chảy tâm trí. Tâm trí của tôi để tâm trí của bạn ... –

+2

Một tâm trí tan chảy? Đó có phải là tất cả cheesy và phục vụ trên bánh mì nướng? –

+0

Vì vậy, tổng thể, nó là một hiệu suất tăng so với việc sử dụng các biến? –

13

Sử dụng hằng số là cách lập trình phòng thủ hơn, để tự bảo vệ bản thân khỏi việc thay đổi giá trị ở đâu đó trong mã khi bạn mã hóa lúc 2 giờ sáng hoặc trước khi uống cà phê.

Về mặt kỹ thuật, có, bạn có thể sử dụng biến thay thế.

+0

2 ý bạn là gì? (phụ) – Ponkadoodle

+3

@wallacoloo: Tất nhiên, cảm ơn. Đó là những gì sẽ xảy ra khi viết một câu trả lời lúc 12 giờ sáng.:) –

+3

Đừng quên, * ngủ * cũng là một chiến thuật lập trình phòng thủ. – Jackson

1

Đó là cách thực sự dễ dàng để bẫy một loại lỗi nhất định. Nếu bạn khai báo biến số const và vô tình cố sửa đổi nó, trình biên dịch sẽ gọi cho bạn trên đó.

6

Hằng số có nhiều lợi thế hơn các biến.

Hằng số cung cấp một số mức độ bảo đảm rằng mã không thể thay đổi giá trị cơ bản. Điều này không quan trọng lắm đối với một dự án nhỏ hơn, nhưng là vấn đề đối với một dự án lớn hơn với nhiều thành phần được viết bởi nhiều tác giả.

Hằng số cũng cung cấp gợi ý mạnh mẽ cho trình biên dịch để tối ưu hóa. Vì trình biên dịch biết giá trị không thể thay đổi, nó không cần tải giá trị từ bộ nhớ và có thể tối ưu hóa mã để làm việc chỉ với giá trị chính xác của hằng số (ví dụ, trình biên dịch có thể sử dụng thay đổi cho phép nhân/phép chia Nếu const là một sức mạnh của 2.)

Hằng số cũng vốn đã tĩnh - bạn có thể khai báo hằng số và giá trị của nó trong tệp tiêu đề và không phải lo lắng về việc xác định chính xác một địa điểm.

+2

Việc đảm bảo như vậy có thể làm cho việc gỡ lỗi và bảo trì sau này trở nên dễ dàng hơn nhiều - nếu một cái gì đó là một biến, bạn sẽ thường thấy mình đang tìm kiếm bất kỳ vị trí nào trong mã thay đổi nó; nếu đó là một hằng số, bạn có thể tránh điều đó. – caf

2

Đối với ngôn ngữ cấp thấp như C, hằng số cho phép tối ưu hóa một số trình biên dịch.

Đối với ngôn ngữ lập trình nói chung, bạn không thực sự cần đến chúng. Các ngôn ngữ động cao cấp như Ruby và JavaScript không có chúng (hoặc ít nhất là không có ý nghĩa thực sự). Các biến được sử dụng thay thế, giống như bạn đã đề xuất.

0

Không sử dụng const có thể có nghĩa là ai đó trong dự án nhóm có thể khai báo ở đâu int FORTY_TWO = 42 và làm cho nó bằng FORTY_TWO = 41 ở một nơi khác bởi một thành viên khác trong nhóm. Vì vậy, kết thúc của thế giới xảy ra và bạn cũng mất câu trả lời cho cuộc sống. với const mặc dù không có điều nào trong số này xảy ra.Plus const được lưu trữ ở nơi khác trong bộ nhớ, khi so sánh với việc lưu trữ các biến thông thường và hiệu quả hơn.

1

Constants là rất cần thiết liên quan đến kê khai intialization của biến cho mọi mục đích như tại thời gian bắt đầu của vòng lặp, để kiểm tra điều kiện trong báo cáo kết quả -else nếu vv

Để tham khảo nhiều hơn, cảm thấy miễn phí để đọc một trong các bài viết sau: tiết kiệm

+0

trang web đó phù hợp với các khái niệm cơ bản .. – yogi

Các vấn đề liên quan