2009-03-23 33 views
13

Tôi có xu hướng sử dụng các từ xác định, khai báo và gán thay thế cho nhau nhưng điều này dường như gây ra hành vi phạm tội đối với một số người. Điều này có hợp lý không? Tôi có nên chỉ sử dụng từ khai báo lần đầu tiên tôi gán cho một biến không? Hay có nhiều hơn thế?Chính xác những định nghĩa, khai báo và bài tập C++ là gì?

+0

Tùy thuộc vào ngôn ngữ, rõ ràng. –

Trả lời

9

Xác định và khai báo tương tự nhưng gán là rất khác nhau.

Ở đây tôi tuyên bố (hoặc xác định) một biến:

int x; 

Ở đây tôi đang gán một giá trị cho biến:

x = 0; 

Ở đây tôi đang làm tất cả trong một tuyên bố:

int x = 0; 

Lưu ý

Không phải tất cả ngôn ngữ hỗ trợ kê khai nhiệm vụ trong một tuyên bố:

T-SQL

declare x int; 
set x = 0; 

Một số ngôn ngữ yêu cầu bạn gán giá trị cho một biến khi kê khai. Yêu cầu này cho phép trình biên dịch hoặc thông dịch của ngôn ngữ để suy ra một kiểu cho biến:

Python

x = 0 
+0

Tôi sẽ chia tóc - Python không có "khai báo" dưới bất kỳ hình thức nào. Các lớp và hàm được "định nghĩa", các biến được tạo khi chúng được gán. Bạn không thực sự "tuyên bố" biến, vì chúng chỉ là tên được gán cho các đối tượng. –

+0

Đó là một điểm tốt - từ một người đi bộ đến người khác Tôi đánh giá cao sự khác biệt :) –

+0

Thêm nitpicking: Python không thực sự làm bất kỳ suy luận kiểu nào, nó được nhập động. Loại suy luận chỉ được yêu cầu khi biến có loại.Đây là Python hợp lệ và minh họa các hiệu ứng của quan điểm của tôi: 'x = 5; x = "str" ​​' –

4

Những thuật ngữ thường có ý nghĩa chính xác trong các tiêu chuẩn cho các ngôn ngữ khác nhau. Khi đó là trường hợp họ không nên bị xáo trộn.

Trong c ví dụ:

  • một chức năng có thể được định nghĩa chỉ một lần (khi bạn nói những gì nó làm), nhưng nó cũng có thể tuyên bố trước đó (khi bạn nói những gì tranh cãi phải mất và loại nó trả về).

  • tương tự, biến là được khai báo khi bạn nói loại đó là gì và điều này chỉ xảy ra một lần cho mỗi phạm vi. Nhưng bạn có thể gán một giá trị lặp lại. (Một số ngôn ngữ cũng phân biệt giữa khởi (đưa ra một biến một giá trị vào thời điểm kê khai) và phân (thay đổi giá trị sau).)

5

Điều quan trọng là sử dụng các thuật ngữ chính xác, nếu không mọi người sẽ không biết bạn đang nói về cái gì, hoặc giả sử không chính xác rằng bạn không biết bạn đang nói về cái gì.

32

Định nghĩa là nơi một giá trị hoặc hàm được mô tả, tức là trình biên dịch hoặc lập trình viên được cho biết chính xác nó là gì, ví dụ:

int foo() 
{ 
    return 1; 
} 

int var; // or, e.g. int var = 5; but this is clearer. 

Tuyên bố cho trình biên dịch hoặc lập trình biết chức năng hoặc biến tồn tại. ví dụ.

int foo(); 
extern int var; 

Nhiệm vụ là khi biến có giá trị được đặt, thường là với toán tử =. ví dụ.

a = b; 
a = foo(); 
+0

+1 đó là cơ bản những gì tôi sẽ viết ... –

+2

Thực ra tôi sẽ xem xét "int var;" được định nghĩa, "int var = 5;" là một kết hợp def/ass. Về cơ bản, trong C, định nghĩa là bất cứ điều gì tạo ra không gian cho một đối tượng. Tôi sẽ upvote anyway, có thể bạn sẽ thay đổi câu trả lời, có thể không, nhưng nó là tốt nhất cho đến nay. – paxdiablo

+0

Cảm ơn lời khuyên, tôi đã cập nhật câu trả lời cho phù hợp. – jheriko

2

Sự khác biệt có thể có vẻ tinh tế, nhưng chúng rất quan trọng. Không phải mọi ngôn ngữ làm cho sự phân biệt như vậy, nhưng trong C++ một biến khai làm cho các loại hình và tên của biến được biết đến với các trình biên dịch

int i; 

Một lưu trữ biến định nghĩa phân bổ và xác định một giá trị ban đầu cho biến .

i = 1; 

Bạn có thể kết hợp khai báo và định nghĩa biến thành một câu lệnh, như thường được thực hiện.

int x = 1; 

Khai báo một biến bên trong một hàm cũng sẽ dành bộ nhớ cho các biến, vì vậy đoạn mã sau ngầm định nghĩa biến a như một phần của việc kê khai.

int main() 
{ 
    int a; 
    return 0; 
} 

Vì biến số a được tự động xác định bởi trình biên dịch, nó sẽ chứa bất kỳ giá trị nào trong vị trí bộ nhớ được phân bổ cho nó. Đây là lý do tại sao không an toàn để sử dụng các biến tự động cho đến khi bạn đã chỉ định rõ ràng giá trị đã biết cho chúng.

An gán diễn ra bất kỳ lúc nào bạn thay đổi giá trị của biến trong chương trình của bạn.

x = 2; 
x++; 
x += 4; 

Tờ khai chức năng, tương tự như khai báo biến, làm cho chức năng chữ ký biết để trình biên dịch. Điều này cho phép bạn gọi một hàm trong mã nguồn của bạn trước khi nó được định nghĩa mà không gây ra lỗi trình biên dịch.

int doSomething(float x); 

Một định nghĩa chức năng xác định kiểu trả về, tên, danh sách tham số, và hướng dẫn cho một chức năng. Ba phần tử đầu tiên trong số các phần tử này phải khớp với khai báo hàm. Hàm chỉ được xác định một lần trong một chương trình đã cho.

int doSomething(float x) 
{ 
    if(x < 0) 
    { 
     x = -x; 
    } 
    return static_cast<int>(x); 
} 

Bạn có thể kết hợp các chức năng decalartion và định nghĩa thành một, nhưng bạn phải làm như vậy trước khi hàm được gọi bất cứ nơi nào trong chương trình của bạn.

+0

Tôi nghĩ rằng một biến * tuyên bố * không gian lưu trữ được giao. Bạn chỉ nhận được rác trong không gian đó trừ khi bạn cũng cung cấp một khởi tạo, hoặc cho đến khi bạn gán một giá trị mới. Bạn chỉ có thể khởi tạo một biến trong khi khai báo nó. – Artelius

+0

@Artelius: Trong hầu hết các trường hợp, khai báo bao gồm một định nghĩa ngầm định của trình biên dịch, điều này làm cho nó xuất hiện khai báo gán không gian lưu trữ. Tôi đã thực hiện một bổ sung (hy vọng) làm rõ để bao gồm điều này trong câu trả lời của tôi. Cảm ơn đã chỉ ra điều đó. –

+0

Tôi đã bỏ phiếu cho câu trả lời này vì nó là chính xác như tôi đã học được nó. Nếu không, tôi thực sự muốn biết tại sao. Các câu trả lời ở trên có tuyên bố và định nghĩa ngược. – lakeweb

-1

Câu trả lời đúng tùy thuộc vào ngôn ngữ bạn đang nói đến. Ngôn ngữ máy tính thường có thuật ngữ cụ thể, hoặc do đặc tả ngôn ngữ hoặc cộng đồng lớn lên xung quanh ngôn ngữ. COBOL, trở lại khi tôi sử dụng nó, đã có một thuật ngữ khác nhiều hơn so với các ngôn ngữ chính thống hơn (theo nghĩa ngôn ngữ gần gũi hơn với dòng chính của phát triển ngôn ngữ, không phải kinh doanh chính thống). Forth đã phát triển một số thuật ngữ kỳ lạ.

Nếu bạn biết tiếng Anh, bạn thường có thể có ý tưởng hay về ý nghĩa bình thường của từ đó, nhưng không bao giờ dựa vào nó quá nhiều. Điều này cũng đúng với các từ cụ thể trong các ngôn ngữ hoặc cộng đồng ngôn ngữ.

-1

Nó có thể phụ thuộc vào ngôn ngữ, như đã nói. Tôi nghĩ rằng nó thực sự phụ thuộc vào việc các từ được sử dụng cho những thứ như lớp học. Đối với hầu hết các kiểu dữ liệu được thảo luận ở đây, câu hỏi có thể không có nhiều sự liên quan. Trong C++ (xem c++ - What is the difference between a definition and a declaration?), một lớp hoặc cấu trúc luôn có chính xác một định nghĩa nhưng có thể được khai báo bằng 0 hoặc nhiều lần. Một lớp không thể được khai báo mà không có một định nghĩa. Vì vậy, "tuyên bố" có thể đồng nghĩa với "được sử dụng".

Trong hầu hết các ngôn ngữ, các loại đơn giản như số nguyên không cần định nghĩa theo cách thức các lớp học thực hiện.

0

Định nghĩa, tuyên bố, và phân có hai trường hợp:

  1. cho biến.
  2. cho Chức năng.

Đối Biến:

- Định nghĩa:
Để cho trình biên dịch để dành bộ nhớ cho biến.

int x; 

- giảm tốc:
Để nói với trình biên dịch rằng biến quy định tại một nơi khác.

extern int x; 

- Bài tập:
Để cho trình biên dịch để đặt giá trị trong biến.

x = 0; 

Đối Chức năng:

- Định nghĩa:

int functionDef(int x){ 
     int x; 
     ... 
     ... 
     ... 
     return x; 
    } 

- giảm tốc:
Nó chỉ là nguyên mẫu của hàm.

int functionDef(int x); 
Các vấn đề liên quan