1 Câu hỏi: Làm thế nào để kết hợp của toán tử làm việc trong quá trình đánh giá biểu thức?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đã học quy tắc ưu tiên trong C ++. Trong đó toán tử có điều kiện được cho là có tính kết hợp từ phải sang trái. Tôi diễn giải điều này khi đánh giá biểu thức bắt đầu từ phải và tiến sang trái. Vì vậy, đối với mã dưới đây -

int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;

Tôi giả sử đầu ra là

8 8

Nhưng sản lượng thực tế là

4 4

Tôi không hiểu thực tế hoạt động kết hợp này hoạt động như thế nào, bởi vì từ đầu ra ở trên, dường như đối với tôi, nhà điều hành có điều kiện đã chuyển sang chế độ kết hợp từ phải sang phải.

    
0
  1. Tại sao bạn mong đợi 8? Chỉ một trong hai nhánh thực thi, không phải cả hai.
    2019-05-08 15: 57: 11Z
  2. 2019-05-08 15: 57: 42Z
1 Câu trả lời                              1                         

Associativity cho bạn biết điều gì sẽ xảy ra nếu bạn có nhiều phiên bản của cùng một toán tử trong một hàng. Ví dụ:

f() - g() - h()

phân tích cú pháp dưới dạng

(f() - g()) - h()

chứ không phải

f() - (g() - h())

- là liên kết trái, không phải liên kết phải.

Không ai trong số này có bất cứ điều gì liên quan đến thứ tự đánh giá, xác định chức năng nào được gọi đầu tiên.

Đối với ?: là liên kết đúng, có nghĩa là

a ? b : c ? d : e

phân tích cú pháp dưới dạng

a ? b : (c ? d : e)

(Điều này có ý nghĩa hơn một chút nếu bạn nghĩ về ?...: với tư cách là một nhà điều hành duy nhất.)

Tuy nhiên, ?: đảm bảo đánh giá từ trái sang phải: Toán hạng đầu tiên luôn được đánh giá trước, sau đó chính xác là một trong các toán hạng khác (tùy thuộc vào giá trị thật của kết quả đầu tiên).

Trong ví dụ của bạn,

c=a>b? a=a*2: a=a+3

(vui lòng không bao giờ đặt các bài tập bên trong ?: như thế trong mã thực) được phân tích cú pháp dưới dạng

c = ((a>b) ? (a=a*2) : (a=a+3))

Điều này hoàn toàn là do quyền ưu tiên, không phải sự kết hợp (chúng tôi không có nhiều toán tử giống hệt nhau ở đây).

,     
5
2019-05-08 16: 08: 00Z
  1. Điều đó có nghĩa là quy tắc kết hợp chỉ áp dụng nếu (có một opaertor khác có cùng mức độ ưu tiên trong biểu thức,) nếu không thì không.
    2019-05-08 16: 04: 56Z
a>b
nguồn đặt đây