2016-07-04 18 views
5

Tiêu chuẩn ngôn ngữ nói:Tuyên bố khai báo và khởi tạo C++ là "", một biểu thức?

[Ghi chú: khoản 5 định nghĩa cú pháp, trình tự thẩm định, và ý nghĩa của expressions.58 Một biểu thức là một chuỗi các nhà khai thác và toán hạng mà xác định một tính toán. Biểu thức có thể dẫn đến giá trị và có thể gây ra tác dụng phụ. - lưu ý cuối cùng]

Ví dụ: Tôi đã viết mã bên dưới:

int i=1; 
A obj; 

Vì vậy, hãy làm cả hai câu trên, được tính là "biểu thức"?

Một số người trên stackoverflow cho biết "int i = 1;" không phải là một biểu thức. Điều này khá lạ với tôi.

(1) Khởi tạo là một loại "tính toán", đúng không? Vì vậy, nó nên được coi là "biểu hiện"?

(2) Một obj; // gọi một ctor. Một ctor là loại tính toán, vì vậy nó nên được coi là "biểu hiện"?

+0

Bản sao có thể có của [câu lệnh biểu thức và biểu thức trong C++ là gì?] (Http: // stackoverflow.com/questions/7479946/whats-an-expression-và-expression-statement-in-c) –

+0

Quy tắc đơn giản là biểu thức không có dấu chấm phẩy. Thêm dấu chấm phẩy biến chúng thành các câu lệnh. Ngoài ra, một biểu thức là một cái gì đó bạn có thể bọc bằng dấu ngoặc đơn và sử dụng bên trong một biểu thức khác. Bạn không thể viết 'x = (int i = 1;)'. –

+0

Kiểm tra ngữ pháp, tôi đã trích xuất ngữ pháp ở đây: https://github.com/o11c/chintzy/blob/master-py/chintzy/_std/cxx14.py#L559 – o11c

Trả lời

6

Ghi chú không quy chuẩn trong tiêu chuẩn nhằm thúc đẩy khái niệm biểu thức, nhưng không phải là định nghĩa thực tế. Định nghĩa của biểu hiện được đưa ra trong ngữ pháp ngôn ngữ được đưa ra trong phần còn lại của khoản 5. Biểu thức được xây dựng trên một số thiết bị đầu cuối như chữ, tên biến và tên hàm, được kết hợp sử dụng toán tử như số học và các nhà khai thác quan hệ.

Tuyên bố và biểu thức là các thực thể cú pháp riêng biệt, do đó, một khai báo được tìm thấy bên trong chương trình C++ không bao giờ là biểu thức, và ngược lại. Sự khác biệt là khá dễ dàng để xem trong nháy mắt: nếu nó tuyên bố một cái gì đó, đó là một tuyên bố.

1;   // expression statement 
int i = 1; // declaration statement that declares `i` 
A(i, 42); // expression statement that creates an A object 
A a(i);  // declaration statement that declares an A object (named a) 

Một tuyên bố có thể đánh giá biểu nhưng một tuyên bố không phải là một biểu thức. Bạn phải chỉ ra rằng việc khai báo một đối tượng kiểu lớp có thể gây ra một cuộc gọi hàm tạo. Tuy nhiên nó là cú pháp một tuyên bố chứ không phải là một biểu thức.

Tuy nhiên, có một ý nghĩa khác trong đó tuyên bố một biểu thức. Cụ thể, các quy tắc về trình tự đánh giá trong các biểu thức cũng áp dụng cho các khai báo. Ví dụ, có một quy tắc rằng tác dụng phụ của một hậu tố tăng trên int diễn ra tại một số điểm trước khi kết thúc biểu thức đầy đủ.

f(i++) + g(); // i may be incremented before or after g() is called... 
h();   // but definitely before h() is called. 

Vì mục đích của quy tắc này, việc khai báo và khởi tạo một biến đơn lẻ được coi là biểu hiện đầy đủ. Trong trường hợp của một biến kiểu lớp, lời gọi hàm tạo là một phần của biểu thức đó.

int i = 1;      // this declaration evaluates a full-expression 
           // whose effect is to initialize `i` to 1 
int j = f(i++) + g(), k = h(); // two separate full-expressions; 
           // i is incremented before h() is called 

Khi đọc tiêu chuẩn, bạn cần xem xét ngữ cảnh để tìm hiểu ý nghĩa của "biểu thức" có nghĩa là gì.

+0

Tuyên bố không phải là một biểu thức; một số "biểu thức đầy đủ" không phải là biểu thức. Các tiêu chuẩn nên sử dụng "biểu hiện đầy đủ" mỗi khi nó có nghĩa là biểu hiện đầy đủ –

+0

Thực ra, 'A (i);' là một khai báo. –

+0

@VaughnCato Tệ của tôi, sẽ sửa. – Brian

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