Tính liên kết (đối với một toán tử) là gì và tại sao nó lại quan trọng?
Đã cập nhật: liên kết toán tử
Tính liên kết (đối với một toán tử) là gì và tại sao nó lại quan trọng?
Đã cập nhật: liên kết toán tử
Câu trả lời:
Đối với toán tử, tính kết hợp có nghĩa là khi cùng một toán tử xuất hiện trong một hàng, thì toán tử nào sẽ xuất hiện trước tiên chúng ta áp dụng. Trong phần sau, hãy Q
là nhà điều hành
a Q b Q c
Nếu Q
được để là liên kết, thì nó đánh giá là
(a Q b) Q c
Và nếu nó là liên kết phù hợp, thì nó sẽ đánh giá là
a Q (b Q c)
Nó quan trọng, vì nó thay đổi ý nghĩa của một biểu thức. Hãy xem xét toán tử chia với số học nguyên, được kết hợp trái
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
Nếu nó là liên kết đúng, nó sẽ đánh giá thành một biểu thức không xác định, vì bạn sẽ chia cho 0
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
expr -> expr + term;
là liên kết trái và expr -> term + expr
liên kết phải.
a * b / c
đánh giá nếu *
sẽ là liên kết bên trái nhưng /
sẽ là liên kết bên phải? Sau đó, có một mâu thuẫn. Vì vậy, tôi nghĩ người ta cần nói "khi các toán tử có cùng mức độ ưu tiên và tính liên kết" nếu bạn muốn bao gồm nhiều toán tử.
Có ba loại liên kết:
Tính chất liên kết trong toán học
Thứ tự hoạt động trong ngôn ngữ lập trình
Tính liên kết trong bộ nhớ đệm của CPU.
Thuộc tính liên kết trong toán học là thuộc tính của các toán tử như phép cộng (+). Thuộc tính này cho phép bạn sắp xếp lại các dấu ngoặc đơn mà không làm thay đổi giá trị của một câu lệnh, tức là:
(a + b) + c = a + (b + c)
Trong ngôn ngữ lập trình, tính liên kết (hoặc tính cố định) của một toán tử là một thuộc tính 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; tức là mỗi toán tử được đánh giá theo thứ tự nào. Điều này có thể khác nhau giữa các ngôn ngữ lập trình.
Trong bộ nhớ đệm của CPU, tính liên kết là một phương pháp tối ưu hóa hiệu suất.
Đơn giản!!
Left Associative means we evaluate our expression from left to right
Right Associative means we evaluate our expression from right to left
Chúng tôi biết *, / và% có cùng mức độ ưu tiên, nhưng theo tính liên kết, câu trả lời có thể thay đổi:
Ví dụ: Chúng ta có biểu thức: 4 * 8/2% 5
Left associative: (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1
Right associative: 4 * 8 /(2 % 5) ==> 4 * ( 8 / 2) ==> 4 * 4 ==> 16
2 % 5
đánh giá thành 2
, không 0
.
Nếu bạn đang đề cập đến "tính liên kết toán tử" - đó là cách một 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 mà không có dấu ngoặc đơn.
Ví dụ, các toán tử + và - trong các 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ả hai (không có dấu ngoặc đơn), trình biên dịch phải xác định thứ tự để đánh giá chúng theo thứ tự nào.
Nếu bạn viết 12 - 5 + 3, các đánh giá có thể bao gồm:
Tùy thuộc vào thứ tự bạn đánh giá biểu thức, bạn có thể nhận được các kết quả khác nhau. Trong các ngôn ngữ dựa trên C, + và - đã để lại tính kết hợp, có nghĩa là biểu thức ở trên sẽ được đánh giá là trường hợp đầu tiên.
Tất cả các ngôn ngữ đều có các quy tắc được xác định rõ ràng cho cả mức độ ưu tiên và tính liên kết. 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ề tính liên kết của toán tử và mức độ ưu tiên được đề cập kỹ trên wikipedia.
nó là thứ tự đánh giá cho các toán tử có cùng mức độ ưu tiên. Thứ tự TRÁI PHẢI hoặc PHẢI TRÁI đều quan trọng. Đối với
3 - 2 - 1
nếu nó là TRÁI sang PHẢI, thì nó là
(3 - 2) - 1
và bằng 0. Nếu nó PHẢI sang TRÁI, thì 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ó phép kết hợp TRÁI ĐẾN PHẢI.
Tình huống về 3 - 2 - 1
có thể có vẻ tầm thường, nếu tuyên bố là, "tất nhiên chúng tôi làm điều đó từ trái sang phải". Nhưng trong các trường hợp khác, chẳng hạn như nếu được thực hiện trong Ruby hoặc trong NodeJS:
$ irb
2.6.3 :001 > 2 ** 3 ** 2
=> 512
Các **
là "với sức mạnh của" nhà điều hành. Sự liên kết là từ phải sang trái. Và nó là
2 ** (3 ** 2)
đó là 2 ** 9
, tức là 512
, thay vì
(2 ** 3) ** 2
đó là 8 ** 2
, tức là 64
.
Tôi cho rằng ý bạn là sự kết hợp toán tử ...
Đó là thứ tự ràng buộc của các toán hạng với một toán tử. Về cơ bản:
a - b + c
có thể được đánh giá là (giả sử - và + có cùng mức độ ưu tiên):
((a - b) + c) hoặc,
(a - (b + c))
Nếu các toán tử được kết hợp bên 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à đầu tiên. Nếu chúng là liên kết phù hợp, nó sẽ được đánh giá là thứ hai.
Tất cả chúng ta đều biết rằng mức độ ưu tiên là quan trọng nhưng tính liên kết trong việc giải thích ý nghĩa của một biểu thức cũng vậy. Để có phần giới thiệu thực sự đơn giản, hãy thử Power of Operator .
Sự liên kết xuất hiện theo thứ tự tính toán trong các khái niệm ngôn ngữ lập trình. Thứ tự tính toán xác định ý nghĩa của biểu thức. Nó có hai quy tắc chính,
- Quy tắc ưu tiên
- Quy tắc liên kết
quy tắc ưu tiên xác định thứ tự mà các toán tử "liền kề" của các kiểu khác nhau được đánh giá. Mọi ngôn ngữ lập trình đều có bảng ưu tiên toán tử riêng liên quan đến các toán tử của nó.
Trở lại với sự liên kết,
Nó xác định thứ tự thực hiện các phép toán liền kề với cùng một mức độ ưu tiên. Nó có 3 hương vị,
thuyết kết hợp
trái - liên kết
phải không liên kết
Nếu một toán tử là liên kết trái, nó đánh giá từ trái sang phải tương tự như vậy nếu nó là liên kết phải, nó sẽ đánh giá từ phải sang trái.