การเชื่อมโยง (สำหรับตัวดำเนินการ) คืออะไรและเหตุใดจึงสำคัญ
อัปเดต:ความสัมพันธ์ของผู้ดำเนินการ
การเชื่อมโยง (สำหรับตัวดำเนินการ) คืออะไรและเหตุใดจึงสำคัญ
อัปเดต:ความสัมพันธ์ของผู้ดำเนินการ
คำตอบ:
สำหรับโอเปอเรเตอร์การเชื่อมโยงหมายความว่าเมื่อตัวดำเนินการเดียวกันปรากฏในแถวแล้วเราจะใช้ตัวดำเนินการใดก่อน ต่อไปนี้ให้Q
เป็นผู้ดำเนินการ
a Q b Q c
หากQ
ปล่อยให้เชื่อมโยงกันระบบจะประเมินเป็น
(a Q b) Q c
และถ้ามันเชื่อมโยงกันอย่างถูกต้องก็จะประเมินเป็น
a Q (b Q c)
เป็นสิ่งสำคัญเนื่องจากจะเปลี่ยนความหมายของนิพจน์ พิจารณาตัวดำเนินการหารด้วยเลขคณิตจำนวนเต็มซึ่งเหลือความเชื่อมโยง
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
หากมีการเชื่อมโยงอย่างถูกต้องก็จะประเมินเป็นนิพจน์ที่ไม่ได้กำหนดเนื่องจากคุณจะหารด้วยศูนย์
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
expr -> expr + term;
เชื่อมโยงด้านซ้ายและการexpr -> term + expr
เชื่อมโยงด้านขวา
a * b / c
ประเมินได้อย่างไรว่า*
จะเชื่อมโยงทางซ้าย แต่/
จะเชื่อมโยงอย่างถูกต้อง? จากนั้นก็มีความขัดแย้ง ดังนั้นฉันคิดว่าต้องพูดว่า "เมื่อตัวดำเนินการที่มีลำดับความสำคัญและความสัมพันธ์เดียวกัน" ถ้าคุณต้องการครอบคลุมตัวดำเนินการหลายตัว
การเชื่อมโยงมีสามประเภท:
คุณสมบัติที่เกี่ยวข้องในคณิตศาสตร์
ลำดับการดำเนินการในภาษาโปรแกรม
คุณสมบัติ Associative ในคณิตศาสตร์เป็นคุณสมบัติของตัวดำเนินการเช่นการบวก (+) คุณสมบัตินี้ช่วยให้คุณสามารถจัดเรียงวงเล็บใหม่ได้โดยไม่ต้องเปลี่ยนค่าของคำสั่งเช่น:
(a + b) + c = a + (b + c)
ในภาษาโปรแกรมความเชื่อมโยง (หรือความคงที่) ของตัวดำเนินการคือคุณสมบัติที่กำหนดวิธีการจัดกลุ่มตัวดำเนินการที่มีลำดับความสำคัญเดียวกันในกรณีที่ไม่มีวงเล็บ กล่าวคือตามลำดับการประเมินแต่ละตัวดำเนินการ สิ่งนี้อาจแตกต่างกันระหว่างภาษาโปรแกรม
ในแคช CPU การเชื่อมโยงเป็นวิธีการเพิ่มประสิทธิภาพ
ง่ายๆ !!
Left Associative means we evaluate our expression from left to right
Right Associative means we evaluate our expression from right to left
เรารู้ว่า *, / และ% มีลำดับความสำคัญเหมือนกัน แต่ตามการเชื่อมโยงคำตอบอาจเปลี่ยนแปลงได้:
ตัวอย่างเช่นเรามีนิพจน์: 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
ประเมินไม่ได้2
0
เป็นลำดับของการประเมินสำหรับตัวดำเนินการที่มีลำดับความสำคัญเดียวกัน LEFT TO RIGHT หรือ RIGHT TO LEFT ORDER มีความสำคัญ สำหรับ
3 - 2 - 1
ถ้าเป็น LEFT ไปทางขวาแสดงว่าเป็น
(3 - 2) - 1
และเป็น 0 ถ้าเป็นขวาไปซ้ายแสดงว่าเป็น
3 - (2 - 1)
และมันก็คือ 2 ในภาษาส่วนใหญ่เราบอกว่าตัวดำเนินการลบมีการเชื่อมโยง LEFT TO RIGHT
สถานการณ์เกี่ยวกับเรื่องนี้3 - 2 - 1
อาจดูไม่สำคัญหากการอ้างสิทธิ์คือ "แน่นอนว่าเราทำจากซ้ายไปขวา" แต่ในกรณีอื่น ๆ เช่นถ้าทำใน Ruby หรือใน NodeJS:
$ irb
2.6.3 :001 > 2 ** 3 ** 2
=> 512
ตัวดำเนินการ**
คือ "พลังของ" การเชื่อมโยงจากขวาไปซ้าย และมันก็เป็น
2 ** (3 ** 2)
ซึ่งก็2 ** 9
คือ512
แทนที่จะเป็น
(2 ** 3) ** 2
ซึ่งก็8 ** 2
คือ64
.
หากคุณกำลังอ้างถึง "การเชื่อมโยงตัวดำเนินการ" - เป็นวิธีที่ภาษากำหนดวิธีการจัดกลุ่มตัวดำเนินการที่มีลำดับความสำคัญเดียวกันโดยไม่มีวงเล็บ
ตัวอย่างเช่นตัวดำเนินการ + และ - ในภาษา C มีความสำคัญเหมือนกัน เมื่อคุณเขียนนิพจน์ที่ใช้ทั้งสอง (โดยไม่มีวงเล็บ) คอมไพลเลอร์จะต้องกำหนดลำดับที่จะประเมินค่า
หากคุณเขียน 12 - 5 + 3 การประเมินที่เป็นไปได้ ได้แก่ :
คุณจะได้ผลลัพธ์ที่แตกต่างกันขึ้นอยู่กับลำดับที่คุณประเมินนิพจน์ ในภาษาซี + และ - ได้ออกจากการเชื่อมโยงซึ่งหมายความว่านิพจน์ข้างต้นจะประเมินเป็นกรณีแรก
ภาษาทั้งหมดมีกฎที่กำหนดไว้อย่างชัดเจนสำหรับทั้งความสำคัญและความสัมพันธ์ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับกฎสำหรับC # ได้ที่นี่ แนวคิดทั่วไปของการเชื่อมโยงผู้ปฏิบัติงานและลำดับความสำคัญได้รับการครอบคลุมอย่างดีในวิกิพีเดีย
ฉันถือว่าคุณหมายถึงการเชื่อมโยงผู้ดำเนินการ ...
เป็นลำดับของการผูกตัวถูกดำเนินการกับตัวดำเนินการ โดยทั่วไป:
ก - ข + ค
อาจได้รับการประเมินเป็น (สมมติ - และ + มีความสำคัญเหมือนกัน):
((a - b) + c) หรือ
(a - (b + c))
หากตัวดำเนินการถูกปล่อยให้เชื่อมโยงกัน (ผูกกับตัวถูกดำเนินการด้านซ้ายทันที) ระบบจะประเมินเป็นตัวแรก หากมีการเชื่อมโยงที่ถูกต้องจะได้รับการประเมินเป็นอันดับสอง
หากคุณหมายถึงความเชื่อมโยงของตัวดำเนินการ:
กำหนดวิธีการแยกวิเคราะห์นิพจน์ มันให้มาตรฐานดังนั้นทุกนิพจน์จะถูกแยกวิเคราะห์ในลักษณะเดียวกัน
ส่วนใหญ่เป็นสิ่งสำคัญสำหรับการดำเนินการที่มีแบบอย่างเดียวกันเมื่ออาจมีผลข้างเคียง
ตัวอย่างก่อนหน้านี้ส่วนใหญ่ใช้ค่าคงที่ หากอาร์กิวเมนต์เกิดขึ้นเป็นการเรียกใช้ฟังก์ชันลำดับที่เรียกใช้อาจถูกกำหนดโดยกฎการเชื่อมโยงทั้งนี้ขึ้นอยู่กับคอมไพเลอร์ของคุณ และหากฟังก์ชั่นเหล่านั้นมีผลข้างเคียง ..
Associativity มาตามลำดับของการคำนวณในแนวคิดภาษาโปรแกรม ลำดับของการคำนวณกำหนดความหมายของนิพจน์ มีกฎหลักสองข้อ
- กฎลำดับความสำคัญ
- กฎการเชื่อมโยง
กฎลำดับความสำคัญกำหนดลำดับที่จะประเมินตัวดำเนินการ "ที่อยู่ติดกัน" ของประเภทต่างๆ ภาษาโปรแกรมทุกภาษามีตารางลำดับความสำคัญของตัวดำเนินการเกี่ยวกับตัวดำเนินการ
กลับมาที่การเชื่อมโยง
เป็นการกำหนดลำดับของการดำเนินการของการดำเนินการที่อยู่ติดกันโดยมีลำดับความสำคัญเดียวกัน มี 3 รสชาติ
ซ้าย associativity
ขวา associativity
ที่ไม่ใช่การเชื่อมโยงกัน
หากตัวดำเนินการเชื่อมโยงกันทางซ้ายระบบจะประเมินจากซ้ายไปขวาเช่นเดียวกันถ้าตัวดำเนินการเชื่อมโยงทางขวาจะประเมินจากขวาไปซ้าย