2009-05-30 40 views
61

Tính kết hợp (đối với người vận hành) là gì và tại sao nó lại quan trọng?Tính liên kết của các nhà khai thác là gì và tại sao nó quan trọng?

Cập nhật: hành associativity

+2

Loại kết hợp nào? Kết hợp vận hành? – Ikke

+1

-1: mơ hồ. Bất kỳ gợi ý nào về ngữ cảnh hoặc những gì bạn muốn biết? –

+16

@Neil Butterworth - Đó là một nhận xét đặc biệt khắc nghiệt về những gì có vẻ như là một câu hỏi hợp lý. Toàn bộ điểm của trang web là một kho lưu trữ trung tâm cho tất cả kiến ​​thức lập trình bao gồm những thứ được đề cập trong các văn bản giới thiệu. Đối với bạn bình luận về @Jian Lin trả lời bình luận của riêng mình rằng quá là chấp nhận được đặt ra trong câu hỏi đầu tiên của các câu hỏi thường gặp chính thức. Ai đó có trình độ đại diện của bạn nên biết rõ hơn. Nếu bạn không đồng ý với nó, ít nhất là dân sự về nó. –

Trả lời

65

Đối với nhà khai thác, khả năng kết hợp có nghĩa là khi cùng một nhà điều hành xuất hiện trong một hàng, thì nhà điều hành nào xuất hiện trước tiên chúng tôi áp dụng.Trong phần tiếp theo, chúng ta hãy Q là nhà khai thác

a Q b Q c 

Nếu Q là kết trái, sau đó nó đánh giá như

(a Q b) Q c 

Và nếu nó là kết hợp đúng, sau đó nó đánh giá như

a Q (b Q c) 

Điều quan trọng là vì nó thay đổi ý nghĩa của một biểu thức. Hãy xem xét các nhà điều hành phân chia với số học số nguyên, mà còn lại kết hợp

4/2/3 <=> (4/2)/3 <=> 2/3  = 0 

Nếu nó là kết hợp đúng, nó sẽ đánh giá để một biểu thức không xác định, vì bạn sẽ chia cho zero

4/2/3 <=> 4/(2/3) <=> 4/0  = undefined 
+0

. là trái hoặc phải cho ngữ pháp nhất định? – user2510115

+1

nếu ngữ pháp có quy tắc sản xuất đệ quy trái/phải. –

+0

Ví dụ: 'expr -> expr + term;' là kết hợp trái và 'expr -> term + expr' là kết hợp đúng. –

2

tôi giả sử bạn có nghĩa là hành associativity ...

Đó là thứ tự ràng buộc của toán hạng để một nhà điều hành. Về cơ bản:

a - b + c

có thể được đánh giá là (giả - và + có cùng độ ưu tiên):

((a - b) + c) hoặc,
(a - (b + c))

Nếu các toán tử liên kết trái (liên kết ngay lập tức với toán hạng bên trái), nó sẽ được đánh giá là giá trị đầu tiên. Nếu họ là đúng liên kết, nó sẽ được đánh giá là thứ hai.

7

Có ba loại associativity:

The Associative property in mathematics

Order of Operations in programming languages

Associativity in CPU caches.

Thuộc tính liên tưởng trong toán học là một tài sản của các nhà khai thác như phép cộng (+). Thuộc tính này cho phép bạn sắp xếp lại ngoặc mà không thay đổi giá trị của một tuyên bố, ví dụ:

(a + b) + c = a + (b + c) 

Trong các ngôn ngữ lập trình, các associativity (hoặc tính cố định) của một nhà điều hành là một tài sản mà xác định cách điều hành của các ưu tiên tương tự được nhóm lại trong số vắng mặt của dấu ngoặc đơn; tức là theo thứ tự từng toán tử được đánh giá. Điều này có thể khác nhau giữa các ngôn ngữ lập trình.

Trong bộ đệm CPU, khả năng kết hợp là một phương pháp tối ưu hóa hiệu suất.

+0

* kết hợp (hoặc độ cố định) của toán tử là thuộc tính xác định cách thức các toán tử có cùng mức ưu tiên được nhóm lại khi không có dấu ngoặc đơn * - cụm từ đó chỉ là hoàn hảo để tôi hiểu được –

1

Nếu bạn có nghĩa là kết hợp nhà điều hành:

Nó xác định cách biểu thức được phân tích cú pháp. Nó đưa ra một tiêu chuẩn, vì vậy mọi biểu thức được phân tích theo cùng một cách.

Điều này chủ yếu quan trọng đối với các hoạt động có cùng tiền lệ, khi có thể có phản ứng phụ.

3

nó là thứ tự đánh giá cho các nhà khai thác của cùng một ưu tiên. TRÁI PHẢI TRÁI PHẢI hoặc QUYỀN TRÁI sang các vấn đề đặt hàng TRÁI. Đối với

3 - 2 - 1 

nếu nó được trái sang phải, sau đó nó là

(3 - 2) - 1 

và là 0. Nếu nó là phải sang trái, sau đó nó là

3 - (2 - 1) 

và nó là 2 Trong hầu hết các ngôn ngữ, chúng ta nói rằng toán tử trừ có một kết hợp LEFT TO RIGHT.

+3

Nếu bạn đã biết câu trả lời thì tại sao bạn lại đặt câu hỏi? –

+2

đó là để giúp đỡ những người mới. tôi nhớ đã học C từ lâu rồi và không biết kết quả thực sự là gì cho đến sau này. –

+3

Tôi nghi ngờ rằng hầu hết mọi người học C có thể làm mà không có sự giúp đỡ của bạn. Ví dụ: –

4

Nếu bạn đang đề cập đến "toán tử kết hợp" - đó là cách ngôn ngữ xác định cách các toán tử có cùng mức ưu tiên được nhóm lại khi không có dấu ngoặc đơn.

Ví dụ: toán tử + và - trong ngôn ngữ dựa trên C có cùng mức độ ưu tiên. . Khi bạn viết một biểu thức sử dụng cả trong số họ (không có dấu ngoặc đơn) trình biên dịch phải xác định những gì để đánh giá chúng trong

Nếu bạn viết 12-5 + 3, đánh giá có thể bao gồm:

  1. (12 - 5) + 3 = 10
  2. 12 - (5 + 3) = 4

Tùy thuộc vào thứ tự bạn đánh giá biểu thức, bạn có thể nhận được kết quả khác nhau. Trong các ngôn ngữ dựa trên C, + và - đã để lại kết hợp, có nghĩa là biểu thức ở trên sẽ đánh giá là trường hợp đầu tiên.

Tất cả ngôn ngữ đều có quy tắc được xác định rõ ràng cho cả ưu tiên và khả năng kết hợp. Bạn có thể tìm hiểu thêm về các quy tắc cho C# tại đây. Các khái niệm chung về toán tử associativityprecedence được bảo vệ tốt trên wikipedia.

+0

Ví dụ của bạn sẽ rõ ràng hơn nếu tất cả chúng đều sử dụng cùng một toán hạng. –

+0

Điều gì sẽ xảy ra nếu hai toán tử có cùng quyền ưu tiên xuất hiện trong một biểu thức không có các mệnh lệnh, nhưng một trong số chúng đã rời khỏi sự kết hợp và cái kia đã đúng? Nó sẽ chỉ sử dụng kết hợp mà trong đó bao giờ nhà điều hành nó tìm thấy đầu tiên? – Hector

0

Hầu hết các ví dụ trước đã sử dụng các hằng số. Nếu các đối số xảy ra là các cuộc gọi hàm, thứ tự các cuộc gọi được thực hiện trong có thể được xác định bởi các quy tắc kết hợp, tùy thuộc vào khóa học trên trình biên dịch của bạn. Và nếu những chức năng đó có tác dụng phụ ..

0

Chúng ta đều biết rằng ưu tiên là quan trọng nhưng như vậy là sự kết hợp trong việc diễn giải ý nghĩa của một biểu thức.Để có phần giới thiệu thực sự đơn giản, hãy thử Power of Operators.

2

Đơn giản !! Hiệp hội còn lại có nghĩa là chúng tôi đánh giá biểu thức của chúng tôi từ trái sang phải.

Phải liên kết có nghĩa là chúng tôi đánh giá biểu thức của chúng tôi từ phải sang trái.

Chúng tôi biết *,/và% có cùng quyền ưu tiên, nhưng theo câu trả lời kết hợp có thể thay đổi.

Đối với ví dụ: Tôi có exp: 4 * 8/2% 5

kết trái: (4 * 8)/2% 5 ==> (32/2)% 5 ==> 16 % 5 ==> 1

kết phải: 4 * 8/(2% 5) ==> 4 * (8/0) ==> không xác định hành vi

tôi hy vọng điều này sẽ giúp. . .

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