2012-02-23 26 views
8

Trong tiêu chuẩn C99, các biểu thức cho phép ưu tiên và kết hợp.Khả năng kết hợp C99 dành cho nhà khai thác - nó được chỉ định ở đâu?

Ưu tiên được ghi nhận khá tốt vì thứ tự các toán tử xuất hiện trong tài liệu là giảm ưu tiên, do đó, các cuộc gọi hàm đến trước toán tử nhân, đến lượt trước các toán tử cộng.

Tuy nhiên, tôi không thể tìm thấy mô tả dứt khoát về kết hợp, cho dù đó là trái hay phải. Điều này quan trọng vì 35/5*2 sẽ là 14 cho một biến thể (35/5)*23 cho biến thể khác 35/(5*2).

Mục 6.5 Expressions /3, footnote 74 nhà nước:

Cú pháp xác định ưu tiên của các nhà khai thác trong việc đánh giá một biểu thức, mà là giống như thứ tự của các subclauses chính của phân lớp này, ưu tiên cao nhất đầu tiên.

Trong mỗi điều khoản chính, người vận hành có cùng quyền ưu tiên. Kết hợp trái hoặc phải được chỉ ra trong mỗi điều khoản bằng cú pháp cho các biểu thức được thảo luận trong đó.

Tuy nhiên, lấy trường hợp nhân giống, ví dụ:

6.5.5 khai thác chất nhân
    Cú pháp
        multiplicative-expression:
            cast-expression
            multiplicative-expression * cast-expression
            multiplicative-expression/cast-expression
            multiplicative-expression % cast-expression

    Ràng buộc

Mỗi toán hạng phải có loại số học. Các toán hạng của toán tử % sẽ là có loại số nguyên.

    Semantics

Quá trình chuyển đổi số học thông thường được thực hiện trên các toán hạng.

Kết quả của toán tử nhị phân * là sản phẩm của toán hạng.

Kết quả của toán tử / là thương từ phân chia toán hạng đầu tiên theo số giây; kết quả của nhà điều hành % là phần còn lại. Trong cả hai hoạt động, nếu giá trị của toán hạng thứ hai bằng 0, hành vi là không xác định.

Khi số nguyên được chia, kết quả của toán tử / là thương số đại số với bất kỳ phần nào được loại bỏ phân đoạn. Nếu thương số a/b là biểu thị, thì biểu thức (a/b)*b + a%b phải bằng a.

Tôi không thấy gì trong đó đề cập đến liên kết, cũng như không có bất kỳ cài đặt mặc định nào khác trong tiêu chuẩn.

Tôi có thiếu gì đó ở đây không?

Trả lời

9

Khả năng kết hợp của nhà điều hành không được chỉ định rõ ràng là "đúng liên kết" hoặc "liên kết bên trái". Bạn suy luận nó từ ngữ pháp. Trong ví dụ của bạn, cụm từ multiplicative-expression đề cập đến chính nó một cách đệ quy và đệ quy nằm ở phía bên tay trái của toán tử. Điều đó có nghĩa là một trình phân tích cú pháp gặp phải a * b * c phải phân tích cú pháp a * b * c như (a * b) * c, là kết hợp trái.

Thuật ngữ assignment-expression (6.5.16) có ngữ pháp này:

assignment-expression: 
    conditional-expression 
    unary-expression assignment-operator assignment-expression 

Vì vậy, một phân tích cú pháp gặp a = b = c phải phân tích nó như a = (b = c), đó là phải kết hợp.

+0

Aaahh, tôi hiểu, nó thực sự trong _grammar_ chứ không phải là văn bản giải thích. Điều đó có ý nghĩa. Có lẽ 'biểu thức cast * biểu thức nhân' sẽ là kết hợp đúng. – paxdiablo

+0

Đúng. Tôi đã thêm một ví dụ về tính tương hợp đúng được lấy từ tiêu chuẩn. –

+0

Thats những gì 'Trái hoặc phải kết hợp được chỉ ra trong mỗi subclause bởi cú pháp' trong chú thích là cố gắng để nói. –

3

Ngữ pháp tự xác định associativity, bởi các tác phẩm được sử dụng:

multiplicative-expression: 
    cast-expression 
    multiplicative-expression * cast-expression 

Điều này có nghĩa rằng trong a * b * c, c phải được phân tích như một cast-expression, và a * b như một multiplicative-expression, trước khi phân tích hơn nữa a * b riêng của mình. Do đó, sự liên kết bên trái của phép nhân được buộc vào trong cây cú pháp bởi các quy tắc phân tích cú pháp.

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