Giả sử chúng ta có mã ví dụ được hiển thị bên dưới trong C. Nó có biên dịch không? Làm thế nào để các khái niệm về giá trị và rvalues làm việc trong vấn đề này?
#define X 8
int main(void)
{
++X; // will this line compile?
return 0;
}
Khái niệm về giá trị và giá trị phải được giải thích một chút để hiểu mã bên trên và vấn đề được hỏi. Trước khi chúng ta tiến hành, bạn nên lưu ý rằng định nghĩa của các giá trị và các giá trị được trình bày ở đây không chính xác vì ngay cả các chuẩn C cũng khá mơ hồ về định nghĩa.
Sự khác biệt giữa giá trị và giá trị
Đối tượng là vùng bộ nhớ có thể kiểm tra nhưng không nhất thiết phải sửa đổi. Một lvalue là một biểu thức đề cập đến một đối tượng như vậy. Thuật ngữ lvalue ban đầu được gọi là các đối tượng xuất hiện ở bên trái (do đó là ‘l’) bên tay của một biểu thức. Định nghĩa đó không còn áp dụng vì bất kỳ loại có đủ điều kiện nào cũng được coi là một giá trị, nhưng nó không bao giờ có thể xuất hiện ở phía bên tay trái của câu lệnh gán bởi vì nó không thể sửa đổi được. Vì vậy, thuật ngữ "lvalue có thể sửa đổi" được tạo ra để tham chiếu đến một giá trị có thể được sửa đổi và một loại có đủ điều kiện không thuộc loại này.
Giá trị là bất kỳ biểu thức nào có giá trị, nhưng không thể gán giá trị cho nó. Người ta cũng có thể nói rằng một rvalue là bất kỳ biểu hiện đó không phải là một lvalue.Một ví dụ về một rvalue sẽ là một hằng số theo nghĩa đen - giống như '8 ′, hoặc' 3,14 ′. Vì vậy, rõ ràng giá trị '8 ′ trong mã ở trên là một giá trị.
Sử dụng sự hiểu biết của chúng ta về lvalues và rvalues để trả lời câu hỏi
Bây giờ chúng ta hãy cố gắng giải quyết vấn đề. Nói đúng ra, toán hạng của toán tử tăng tiền tố (hoặc postfix) phải là một giá trị có thể sửa đổi được. Vì vậy, toán hạng của toán tử tăng thêm tiền tố trong mã của chúng ta ở trên là gì?
Vì X là macro, câu lệnh ở trên sẽ mở rộng thành “++ 8 ″ sau khi bộ tiền xử lý được chạy. Điều này có nghĩa là "8" là toán hạng của toán tử tăng tiền tố. Và, bởi vì 8 là một rvalue nó không thể được sử dụng như một đối số để "+ +". Điều này, đến lượt nó, có nghĩa là mã ở trên sẽ không biên dịch.
Nguồn
2013-06-28 05:42:32
Tôi tin câu cuối cùng của bạn có nó ở phía sau –