Tôi đang viết một trình biên dịch C tuân theo tiêu chuẩn này và nếu tôi phân tích các câu như thế này:
int i;
(i) = 1;
trình biên dịch của tôi sẽ báo cáo một lỗi chỉ ra đó (i)
là một giá trị và không nên gán.
Tôi đã kiểm tra mã và các quy tắc và tìm thấy điều này: trong ngữ nghĩa biểu thức gán:
Một toán tử gán sẽ có một giá trị có thể sửa đổi là toán hạng bên trái của nó.
Một biểu thức gán có giá trị của toán hạng bên trái sau khi gán, nhưng không phải là một giá trị.
Trong trường hợp của tôi, có hai biểu thức gán:
(i) = 1
và i
trong ngoặc đơn. Vì vậy, (i)
nên là một giá trị.
Vì vậy, câu hỏi của tôi là: Có
(i) = 1
bất hợp pháp trong tiêu chuẩn C này?
i
trong ngoặc đơn không phải là biểu thức gán. Biểu thức chuyển nhượng không có nghĩa là "biểu thức liên quan đến một nhiệm vụ" hoặc bất cứ điều gì khác (i)
sẽ đủ điều kiện. Biểu thức chuyển nhượng là bài tập .
i
là một biểu hiện chuyển nhượng, cây AST được EXPRESSION-> ASSIGNMENT_EXPRESSION-> CONDITIONAL_EXPRESSION-> LOGICAL_OR_EXPRESSION-> CAST_EXPRESSION-> UNARY_EXPRESSION-> POSTFIX_EXPRESSION-> PRIMARY_EXPRESSION-> IDENTIFIER
assignment-expression
ngữ pháp nonterminal không giống với biểu thức gán. Một cách thô bạo, an assignment-expression
là một biểu thức gán hoặc bất cứ thứ gì có độ ưu tiên cao hơn.