2011-11-07 52 views
8

Tôi đọc có các hằng số từ vựng, toán tử từ vựng, phạm vi từ vựng, v.v ... làm cách nào cụm từ "từ vựng" thay đổi ý nghĩa cho một chuỗi ký tự không đổi, cho bất kỳ toán tử nào hoặc phạm vi của một số định danh?Thuật ngữ "lexical" có nghĩa là gì trong C++?

Trả lời

0

đặt sử dụng cụm từ 'hằng số từ vựng' không ngụ ý một loại hằng số khác.

Nói chung, khi bạn đang nói về ngữ pháp C++, bạn sẽ sử dụng thuật ngữ từ vựng này, từ vựng đó. Trái ngược với các hằng số được lưu trữ trong các đối tượng và phạm vi của một tệp hoặc một toán tử trên một ma trận. Vì vậy, nếu tôi đang nói về một dòng mã, có một hằng số như: (32786) Tôi có thể sử dụng từ vựng (có thể không cần thiết) để xác nhận ý nghĩa rằng số chỉ tồn tại dưới dạng mã thông báo C++.

Vì vậy, khi tôi đang nói về C++ tokens và mối quan hệ của họ, tôi đang sử dụng từ vựng như wikipedia does.

7

"từ vựng" có nghĩa là nó có liên quan đến mã nguồn.

Ví dụ: 1 là hằng số từ vựng. OTOH, sizeof(char) cũng là một biểu thức hằng số tích phân biên dịch, nhưng nó không phải là một hằng số từ vựng. Về cơ bản, nó là một lời gọi của toán tử sizeof.

Các toán tử Lexical hoạt động trên mã nguồn. Các nhà khai thác tiền xử lý rơi vào thể loại này.

Trong hầu hết các trường hợp, nó không tạo ra sự khác biệt nào dù tôi sử dụng 1 hoặc sizeof(char) ở bất kỳ đâu trong chương trình của tôi. Nhưng, như lập luận của các nhà khai thác từ vựng # hoặc ## nó làm cho một sự khác biệt đáng kể, bởi vì những công việc trên mã thực tế và không phải là kết quả của đánh giá:

#define STR(x) #x 

std::string one = STR(1); 
std::string also_one = STR(sizeof(char)); 

Cuối cùng, phạm vi từ vựng có nghĩa là một phần của nguồn chương trình mã có mã định danh tồn tại (được nhận dạng, có thể được sử dụng). Điều này trái ngược với phạm vi động, còn được gọi là tuổi thọ đối tượng, là phần của chương trình mà đối tượng tồn tại (duy trì giá trị của nó và có thể được điều khiển gián tiếp qua con trỏ hoặc tham chiếu, mặc dù tên không nằm trong phạm vi từ vựng) .

string f(string x) { return "2" + x; } // main's "y" is not in lexical scope, however it is in dynamic scope, and will not be destroyed yet 

int main(void) 
{ 
    string y = "5.2"; // y enters lexical scope and dynamic scope 

    string z = f("y"); // y leaves lexical scope as f is called, and comes back into lexical scope when f returns 

    return z.size(); 
    // z leaves lexical and dynamic scope, destructor is called 
} 
Các vấn đề liên quan