ความเชื่อมโยงของตัวดำเนินการคืออะไรและเหตุใดจึงสำคัญ?


89

การเชื่อมโยง (สำหรับตัวดำเนินการ) คืออะไรและเหตุใดจึงสำคัญ

อัปเดต:ความสัมพันธ์ของผู้ดำเนินการ


2
ความสัมพันธ์แบบไหน? สมาคมผู้ประกอบการ?
Ikke

26
@ นีลบัตเตอร์เวิร์ ธ - นั่นเป็นความคิดเห็นที่รุนแรงโดยเฉพาะสำหรับสิ่งที่ดูเหมือนเป็นคำถามที่สมเหตุสมผล จุดรวมของไซต์คือการเป็นพื้นที่เก็บข้อมูลกลางสำหรับความรู้ด้านการเขียนโปรแกรมทั้งหมดรวมถึงสิ่งที่กล่าวถึงในข้อความเบื้องต้น สำหรับคุณแสดงความคิดเห็นเกี่ยวกับ @Jian Lin ที่ตอบความคิดเห็นของเขาเองซึ่งก็ยอมรับได้เช่นกันตามที่ระบุไว้ในคำถามแรกของคำถามที่พบบ่อยอย่างเป็นทางการ คนที่มีระดับตัวแทนของคุณควรรู้ดีกว่า หากคุณไม่เห็นด้วยกับเรื่องนี้อย่างน้อยก็จงเป็นฝ่ายแพ่ง
Rob Allen

1
@Rob Allen ดูโพสต์อื่น ๆ ของเขา นอกจากนี้ฉันไม่ได้บอกว่าเขาไม่ควรตอบโพสต์ของตัวเองเพียงแต่ว่ามันไม่เป็นประโยชน์ และฉันจะจัดการให้คุณ - ฉันจะไม่บอกวิธีการโพสต์ข้อความของคุณที่นี่ถ้าคุณไม่บอกวิธีการใช้วลีของฉัน

คำตอบ:


106

สำหรับโอเปอเรเตอร์การเชื่อมโยงหมายความว่าเมื่อตัวดำเนินการเดียวกันปรากฏในแถวแล้วเราจะใช้ตัวดำเนินการใดก่อน ต่อไปนี้ให้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

คุณรู้วิธีค้นหาการเชื่อมโยงไม่ว่าจะเป็นทางซ้ายหรือทางขวาสำหรับแกรมมาร์ที่กำหนด?
user2510115

1
ตัวอย่างเช่นการexpr -> expr + term;เชื่อมโยงด้านซ้ายและการexpr -> term + exprเชื่อมโยงด้านขวา
Subin Sebastian

15
ในบรรทัดแรกของคำตอบแทนที่จะเป็น "เมื่อตัวดำเนินการเดียวกันปรากฏ" ควรพูดว่า "เมื่อตัวดำเนินการที่มีลำดับความสำคัญเดียวกันปรากฏขึ้น" ตัวอย่าง: a * b / c => โดยที่ * และ / มีลำดับความสำคัญเหมือนกัน
1O1

2
@ 1O1 ขอบคุณ แต่จะเกิดอะไรขึ้นถ้าตัวดำเนินการที่มีลำดับความสำคัญเดียวกันมีการเชื่อมโยงที่แตกต่างกัน จะa * b / cประเมินได้อย่างไรว่า*จะเชื่อมโยงทางซ้าย แต่/จะเชื่อมโยงอย่างถูกต้อง? จากนั้นก็มีความขัดแย้ง ดังนั้นฉันคิดว่าต้องพูดว่า "เมื่อตัวดำเนินการที่มีลำดับความสำคัญและความสัมพันธ์เดียวกัน" ถ้าคุณต้องการครอบคลุมตัวดำเนินการหลายตัว
Johannes Schaub - litb

2
@ มาร์คฉันไม่รู้ แต่คิดไม่ออกว่ามันควรจะเป็นยังไง อาจจะคุ้มค่ากับคำถาม stackoverflow พิเศษ
Johannes Schaub - litb

13

การเชื่อมโยงมีสามประเภท:

คุณสมบัติที่เกี่ยวข้องในคณิตศาสตร์

ลำดับการดำเนินการในภาษาโปรแกรม

ความสัมพันธ์ในแคช CPU

คุณสมบัติ Associative ในคณิตศาสตร์เป็นคุณสมบัติของตัวดำเนินการเช่นการบวก (+) คุณสมบัตินี้ช่วยให้คุณสามารถจัดเรียงวงเล็บใหม่ได้โดยไม่ต้องเปลี่ยนค่าของคำสั่งเช่น:

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

ในภาษาโปรแกรมความเชื่อมโยง (หรือความคงที่) ของตัวดำเนินการคือคุณสมบัติที่กำหนดวิธีการจัดกลุ่มตัวดำเนินการที่มีลำดับความสำคัญเดียวกันในกรณีที่ไม่มีวงเล็บ กล่าวคือตามลำดับการประเมินแต่ละตัวดำเนินการ สิ่งนี้อาจแตกต่างกันระหว่างภาษาโปรแกรม

ในแคช CPU การเชื่อมโยงเป็นวิธีการเพิ่มประสิทธิภาพ


3
การเชื่อมโยง (หรือความคงที่) ของตัวดำเนินการเป็นคุณสมบัติที่กำหนดวิธีการจัดกลุ่มตัวดำเนินการที่มีลำดับความสำคัญเดียวกันโดยไม่มีวงเล็บ - วลีนั้นเหมาะอย่างยิ่งที่จะทำให้ฉันเข้าใจ
Rafael Eyng

7

ง่ายๆ !!

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
ดูเหมือนจะมีข้อผิดพลาดในคำตอบ: 2 % 5ประเมินไม่ได้2 0
6005

6

เป็นลำดับของการประเมินสำหรับตัวดำเนินการที่มีลำดับความสำคัญเดียวกัน LEFT TO RIGHT หรือ RIGHT TO LEFT ORDER มีความสำคัญ สำหรับ

3 - 2 - 1

ถ้าเป็น LEFT ไปทางขวาแสดงว่าเป็น

(3 - 2) - 1

และเป็น 0 ถ้าเป็นขวาไปซ้ายแสดงว่าเป็น

3 - (2 - 1)

และมันก็คือ 2 ในภาษาส่วนใหญ่เราบอกว่าตัวดำเนินการลบมีการเชื่อมโยง LEFT TO RIGHT

อัปเดตปี 2020:

สถานการณ์เกี่ยวกับเรื่องนี้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.


4
ถ้าคุณรู้คำตอบแล้วทำไมคุณถึงถามคำถาม?
Robert Harvey

6
เป็นการช่วยเหลือผู้คนใหม่ ๆ ฉันจำได้ว่าเรียนรู้ C เมื่อนานมาแล้วและไม่รู้ว่าความสัมพันธ์เป็นอย่างไรจนกระทั่งในภายหลัง
nonopolarity

3
ฉันสงสัยว่าคนส่วนใหญ่ที่เรียนรู้ C สามารถทำได้โดยไม่ต้องมี "ความช่วยเหลือ" ของคุณ

1
ตัวอย่างเช่นการเชื่อมโยงถูก จำกัด ไว้ที่ตัวดำเนินการเดียวกันหรือสำหรับตัวดำเนินการที่มีลำดับความสำคัญเดียวกัน หลายคนสามารถตอบได้อย่างแน่นอนโดยไม่ต้องตรวจสอบหนังสือหรือเอกสารอ้างอิง?
nonopolarity

13
@ นีลบัตเตอร์เวิร์ ธ ทำไมถึงเป็นศัตรูกัน? ฉันคิดว่าคุณสามารถโพสต์คำตอบสำหรับคำถามของคุณเองได้ สิ่งนี้อยู่ในคำถามที่พบบ่อยและมีการกล่าวถึงในพอดคาสต์หลายครั้ง
Jay Conrod

5

หากคุณกำลังอ้างถึง "การเชื่อมโยงตัวดำเนินการ" - เป็นวิธีที่ภาษากำหนดวิธีการจัดกลุ่มตัวดำเนินการที่มีลำดับความสำคัญเดียวกันโดยไม่มีวงเล็บ

ตัวอย่างเช่นตัวดำเนินการ + และ - ในภาษา C มีความสำคัญเหมือนกัน เมื่อคุณเขียนนิพจน์ที่ใช้ทั้งสอง (โดยไม่มีวงเล็บ) คอมไพลเลอร์จะต้องกำหนดลำดับที่จะประเมินค่า

หากคุณเขียน 12 - 5 + 3 การประเมินที่เป็นไปได้ ได้แก่ :

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

คุณจะได้ผลลัพธ์ที่แตกต่างกันขึ้นอยู่กับลำดับที่คุณประเมินนิพจน์ ในภาษาซี + และ - ได้ออกจากการเชื่อมโยงซึ่งหมายความว่านิพจน์ข้างต้นจะประเมินเป็นกรณีแรก

ภาษาทั้งหมดมีกฎที่กำหนดไว้อย่างชัดเจนสำหรับทั้งความสำคัญและความสัมพันธ์ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับกฎสำหรับC # ได้ที่นี่ แนวคิดทั่วไปของการเชื่อมโยงผู้ปฏิบัติงานและลำดับความสำคัญได้รับการครอบคลุมอย่างดีในวิกิพีเดีย


ตัวอย่างของคุณจะชัดเจนขึ้นหากพวกเขาทั้งหมดใช้ตัวถูกดำเนินการเดียวกัน
Michael Carman

จะเกิดอะไรขึ้นถ้าตัวดำเนินการสองตัวที่มีลำดับความสำคัญเหมือนกันปรากฏในนิพจน์โดยไม่มี parantheses แต่หนึ่งในนั้นมีการเชื่อมโยงซ้ายและอีกตัวมีสิทธิ์ มันจะใช้การเชื่อมโยงของตัวดำเนินการที่เคยพบก่อนหรือไม่?
Hector

มันไม่สามารถเกิดขึ้นได้ในฐานะที่เป็นแบบอย่างเดียวกันหมายถึงการเชื่อมโยงเดียวกัน หากนี่ไม่ใช่กรณีที่อาจเป็นความคลุมเครือที่คุกคามการดำรงอยู่ของความเป็นจริง
Ankur S

3

ฉันถือว่าคุณหมายถึงการเชื่อมโยงผู้ดำเนินการ ...

เป็นลำดับของการผูกตัวถูกดำเนินการกับตัวดำเนินการ โดยทั่วไป:

ก - ข + ค

อาจได้รับการประเมินเป็น (สมมติ - และ + มีความสำคัญเหมือนกัน):

((a - b) + c) หรือ
(a - (b + c))

หากตัวดำเนินการถูกปล่อยให้เชื่อมโยงกัน (ผูกกับตัวถูกดำเนินการด้านซ้ายทันที) ระบบจะประเมินเป็นตัวแรก หากมีการเชื่อมโยงที่ถูกต้องจะได้รับการประเมินเป็นอันดับสอง


1

หากคุณหมายถึงความเชื่อมโยงของตัวดำเนินการ:

กำหนดวิธีการแยกวิเคราะห์นิพจน์ มันให้มาตรฐานดังนั้นทุกนิพจน์จะถูกแยกวิเคราะห์ในลักษณะเดียวกัน

ส่วนใหญ่เป็นสิ่งสำคัญสำหรับการดำเนินการที่มีแบบอย่างเดียวกันเมื่ออาจมีผลข้างเคียง


0

ตัวอย่างก่อนหน้านี้ส่วนใหญ่ใช้ค่าคงที่ หากอาร์กิวเมนต์เกิดขึ้นเป็นการเรียกใช้ฟังก์ชันลำดับที่เรียกใช้อาจถูกกำหนดโดยกฎการเชื่อมโยงทั้งนี้ขึ้นอยู่กับคอมไพเลอร์ของคุณ และหากฟังก์ชั่นเหล่านั้นมีผลข้างเคียง ..


0

เราทุกคนรู้ดีว่าลำดับความสำคัญมีความสำคัญ แต่ความสัมพันธ์ในการตีความความหมายของนิพจน์ก็เช่นกัน หาง่ายจริงๆบทนำลองพลังของผู้ประกอบการ


0

Associativity มาตามลำดับของการคำนวณในแนวคิดภาษาโปรแกรม ลำดับของการคำนวณกำหนดความหมายของนิพจน์ มีกฎหลักสองข้อ

  1. กฎลำดับความสำคัญ
  2. กฎการเชื่อมโยง

กฎลำดับความสำคัญกำหนดลำดับที่จะประเมินตัวดำเนินการ "ที่อยู่ติดกัน" ของประเภทต่างๆ ภาษาโปรแกรมทุกภาษามีตารางลำดับความสำคัญของตัวดำเนินการเกี่ยวกับตัวดำเนินการ

กลับมาที่การเชื่อมโยง

เป็นการกำหนดลำดับของการดำเนินการของการดำเนินการที่อยู่ติดกันโดยมีลำดับความสำคัญเดียวกัน มี 3 รสชาติ

ซ้าย associativity
ขวา associativity
ที่ไม่ใช่การเชื่อมโยงกัน

หากตัวดำเนินการเชื่อมโยงกันทางซ้ายระบบจะประเมินจากซ้ายไปขวาเช่นเดียวกันถ้าตัวดำเนินการเชื่อมโยงทางขวาจะประเมินจากขวาไปซ้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.