กลับไปหน้าบทความ

อ่าน 3 นาที

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

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

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

ในทฤษฎีภาษาโปรแกรมความสัมพันธ์ของตัวดำเนินการ (associativity ) คือคุณสมบัติที่กำหนดว่าตัวดำเนินการที่มีลำดับความสำคัญ เท่ากัน จะถูกจัดกลุ่มอย่างไรในกรณีที่ไม่มีวงเล็บถ้าตัวถูกดำเนินการ (operand) อยู่ทั้งข้างหน้าและข้างหลังตัวดำเนินการ (เช่น^ 3 ^) และตัวดำเนินการเหล่านั้นมีลำดับความสำคัญเท่ากัน ตัวถูกดำเนินการนั้นสามารถใช้เป็นอินพุตสำหรับการดำเนินการที่แตกต่างกันสองอย่างได้ (เช่น การดำเนินการสองอย่างที่ระบุโดยตัวดำเนินการทั้งสอง) การเลือกใช้การดำเนินการใดกับตัวถูกดำเนินการนั้นถูกกำหนดโดยความสัมพันธ์ของตัวดำเนินการ ตัวดำเนินการอาจมีความสัมพันธ์ (หมายความว่าการดำเนินการสามารถจัดกลุ่มได้ตามอำเภอใจ) ความสัมพันธ์แบบซ้าย (หมายความว่าการดำเนินการจะถูกจัดกลุ่มจากซ้าย) ความสัมพันธ์แบบขวา ( หมายความว่าการดำเนินการจะถูกจัดกลุ่มจากขวา) หรือไม่สัมพันธ์ (หมายความว่าการดำเนินการไม่สามารถเชื่อมโยงกันได้ มักเป็นเพราะชนิดของผลลัพธ์ไม่เข้ากันกับชนิดของอินพุต) ความสัมพันธ์และลำดับความสำคัญของตัวดำเนินการเป็นส่วนหนึ่งของคำจำกัดความของภาษาโปรแกรม ภาษาโปรแกรมที่แตกต่างกันอาจมีการจัดลำดับความเชื่อมโยงและลำดับความสำคัญที่แตกต่างกันสำหรับตัวดำเนินการประเภทเดียวกัน

พิจารณานิพจน์ต่อไป นี้ a ~ b ~ cถ้าตัวดำเนินการ~มีการเชื่อมโยงทางซ้าย นิพจน์นี้จะถูกตีความว่า(a ~ b) ~ cถ้าตัวดำเนินการมีการเชื่อมโยงทางขวา นิพจน์นี้จะถูกตีความว่าa ~ (b ~ c)ถ้าตัวดำเนินการไม่มีการเชื่อมโยง นิพจน์นี้อาจเป็นข้อผิดพลาดทางไวยากรณ์หรืออาจมีความหมายพิเศษบางอย่าง ตัวดำเนินการทางคณิตศาสตร์บางตัวมีการเชื่อมโยงโดยธรรมชาติ ตัวอย่างเช่น การลบและการหาร ตามที่ใช้ในสัญลักษณ์ทางคณิตศาสตร์ทั่วไป มีการเชื่อมโยงทางซ้ายโดยธรรมชาติ ในทางตรงกันข้าม การบวกและการคูณมีการเชื่อมโยงทั้งทางซ้ายและขวา (เช่น(a * b) * c = a * (b * c))

คู่มือภาษาโปรแกรมหลายเล่มมีตารางแสดงลำดับความสำคัญและการเชื่อมโยงของตัวดำเนินการ ตัวอย่างเช่น ดูตารางสำหรับภาษา C และ C ++

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

ตัวอย่าง

คุณสมบัติการสลับที่ (Associativity) จำเป็นเฉพาะเมื่อตัวดำเนินการในนิพจน์มีลำดับความสำคัญเท่ากัน โดยปกติแล้ว+และ-จะมีลำดับความสำคัญเท่ากัน พิจารณานิพจน์7 - 4 + 2ผลลัพธ์อาจเป็น(7 - 4) + 2 = 5หรือ ผลลัพธ์แบบแรกสอดคล้องกับกรณีที่ และเป็นแบบสลับที่ทางซ้าย ส่วน7 - (4 + 2) = 1ผลลัพธ์แบบหลังสอดคล้องกับกรณีที่และเป็นแบบสลับที่ทางขวา +-+-

เพื่อให้สอดคล้องกับการใช้งานปกติตัว ดำเนิน การบวกลบคูณและหารมักจะเชื่อมโยงไปทางซ้าย[ 1 ] [ 2 ] [ 3 ]ในขณะที่ ตัวดำเนินการ ยกกำลัง (ถ้ามี) [ 4 ]ยังไม่มีข้อตกลงทั่วไป ตัวดำเนิน การกำหนดค่า ใดๆ มักจะเชื่อมโยงไปทางขวา เพื่อป้องกันกรณีที่ตัวถูกดำเนินการจะถูกเชื่อมโยงกับตัวดำเนินการสองตัว หรือไม่มีตัวดำเนินการเลย ตัวดำเนินการที่มีลำดับความสำคัญเท่ากันจะต้องมีการเชื่อมโยงแบบเดียวกัน

ตัวอย่างโดยละเอียด

พิจารณานิพจน์5^4^3^2ซึ่ง^ถือว่าเป็นตัวดำเนินการยกกำลังแบบเชื่อมโยงทางขวา ตัวแยกวิเคราะห์ที่อ่านโทเค็นจากซ้ายไปขวาจะใช้กฎการเชื่อมโยงกับสาขา เนื่องจาก เป็นการเชื่อมโยงทางขวา^ในลักษณะดังต่อไปนี้:

  1. 5อ่านคำศัพท์ แล้ว
  2. ^อ่านค่าที่ไม่ใช่เทอร์ มินัล โหนด: " 5^".
  3. 4อ่านเทอม แล้ว โหนด: " 5^4".
  4. มีการอ่าน ค่าที่ไม่ใช่เทอร์มินัล^ทำให้เกิดกฎการเชื่อมโยงทางขวา การเชื่อมโยงจะตัดสินโหนด: " 5^(4^"
  5. 3อ่านเทอม แล้ว โหนด: " 5^(4^3".
  6. มีการอ่าน ค่าที่ไม่ใช่เทอร์มินัล^ทำให้เกิดการนำกฎการเชื่อมโยงทางขวามาใช้อีกครั้ง โหนด " 5^(4^(3^"
  7. 2อ่านเทอม แล้ว โหนด " 5^(4^(3^2"
  8. ไม่มีโทเค็นให้อ่าน ใช้หลักการเชื่อมโยงเพื่อสร้างแผนผังการวิเคราะห์ " 5^(4^(3^2))"

จากนั้นจึงสามารถประเมินผลโดยใช้การค้นหาเชิงลึก โดยเริ่มจากโหนดบนสุด (โหนดแรก^):

  1. ผู้ประเมินจะไล่เรียงตามลำดับจากข้อแรก ไปยังข้อที่สอง และไปยัง^ข้อ ที่สาม
  2. ผลลัพธ์คือ 3 2 = 9 ผลลัพธ์จะแทนที่สาขาการแสดงออกเป็นตัวถูกดำเนินการตัวที่สองของตัวที่^สอง
  3. การประเมินจะดำเนินต่อไปอีกหนึ่งระดับตามแผนผังการวิเคราะห์ดังนี้: 4 9 = 262,144 อีกครั้ง ผลลัพธ์จะแทนที่สาขาการแสดงออกเป็นตัวถูกดำเนินการตัวที่สองของสาขา^แรก
  4. อีกครั้ง ตัวประเมินจะเลื่อนขึ้นไปตามโครงสร้างต้นไม้จนถึงนิพจน์รากและประเมินผลดังนี้: 5 2621446.206 0699 × 10 183 230สาขาสุดท้ายที่เหลืออยู่จะยุบตัวลง และผลลัพธ์ที่ได้จะกลายเป็นผลลัพธ์โดยรวม ดังนั้นจึงเป็นการประเมินโดยรวมเสร็จสมบูรณ์

การประเมินแบบเชื่อมโยงซ้ายจะส่งผลให้ได้แผนผังการวิเคราะห์ ((5^4)^3)^2และผลลัพธ์ที่แตกต่างกันโดยสิ้นเชิง (625 3 ) 2 = 244,140,625 25.960 4645 × 10 16 .

ความสัมพันธ์แบบขวาของตัวดำเนินการกำหนดค่า

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

ในภาษา Cการกำหนดค่าa = bเป็นนิพจน์ที่ประเมินค่าได้เท่ากับนิพจน์bที่แปลงเป็นชนิดของaโดยมีผลข้างเคียงคือการเก็บค่า Rของbลงในค่า Lของa[ a ]ดังนั้นนิพจน์จึงสามารถตีความได้เป็นนิพจน์ทางเลือกทำให้เกิดข้อผิดพลาดเนื่องจากไม่ใช่นิพจน์ค่า L กล่าวคือ มีค่า R แต่ไม่มีค่า L ที่จะเก็บค่า R ของการเชื่อมโยงทางขวาของ ตัวดำเนินการทำให้สามารถ ตีความนิพจน์เช่น เป็น ได้ a = (b = c)b = c; a = b;(a = b) = ca = bc=a = b = ca = (b = c)

ในC++การกำหนดค่าa = bเป็นนิพจน์ที่ประเมินค่าได้เท่ากับนิพจน์aโดยมีผลข้างเคียงคือการเก็บค่า R ของbลงในค่า L ของaดังนั้นนิพจน์ จึงa = (b = c)ยังคงสามารถตีความได้เป็นb = c; a = b;และนิพจน์ทางเลือก(a = b) = cสามารถตีความได้เป็นa = b; a = c;แทนที่จะเกิดข้อผิดพลาด การเชื่อมโยงทางขวาของ ตัวดำเนินการ ทำให้สามารถ ตีความ=นิพจน์ เช่น เป็น ได้ a = b = ca = (b = c)

ตัวดำเนินการที่ไม่สัมพันธ์กัน

ตัวดำเนินการที่ไม่สัมพันธ์กัน (Non-associative operators) คือตัวดำเนินการที่ไม่มีพฤติกรรมที่กำหนดไว้เมื่อใช้เรียงกันในนิพจน์ ในภาษาโปรล็อกตัวดำเนินการแบบอินฟิกซ์ (infix operator) :-เป็นตัวดำเนินการที่ไม่สัมพันธ์กันเนื่องจากโครงสร้างเช่น " a :- b :- c" ถือเป็นข้อผิดพลาดทางไวยากรณ์

อีกความเป็นไปได้หนึ่งคือ ลำดับของตัวดำเนินการบางอย่างอาจถูกตีความในรูปแบบอื่น ซึ่งไม่สามารถแสดงออกมาในรูปของความสัมพันธ์แบบสมาคมได้ โดยทั่วไปแล้วหมายความว่า ในทางไวยากรณ์จะมีกฎพิเศษสำหรับลำดับของการดำเนินการเหล่านี้ และในทางความหมายพฤติกรรมจะแตกต่างกัน ตัวอย่างที่ดีคือในภาษา Pythonซึ่งมีโครงสร้างดังกล่าวอยู่หลายแบบ[ 5 ]เนื่องจากการกำหนดค่าเป็นคำสั่ง ไม่ใช่การดำเนินการ ตัวดำเนินการกำหนดค่าจึงไม่มีค่าและไม่มีความสัมพันธ์แบบสมาคมการกำหนดค่าแบบลูกโซ่จะถูกนำไปใช้โดยการมีกฎไวยากรณ์สำหรับลำดับของการกำหนดค่าa = b = cซึ่งจะถูกกำหนดจากซ้ายไปขวา นอกจากนี้ การรวมกันของการกำหนดค่าและการกำหนดค่าเพิ่มเติมเช่นa = b += cไม่ถูกต้องใน Python แม้ว่าจะถูกต้องใน C ก็ตาม อีกตัวอย่างหนึ่งคือตัวดำเนินการเปรียบเทียบ เช่น,> , ==และ<=การเปรียบเทียบแบบลูกโซ่ เช่นa < b < cจะถูกตีความว่าเป็น(a < b) and (b < c)ไม่เทียบเท่ากับ(a < b) < cหรือ[ 6a < (b < c) ]

ดูเพิ่มเติม

หมายเหตุ

  1. ^นิพจน์สามารถเปลี่ยนเป็นประโยคบอกเล่าได้โดยการใส่เครื่องหมายเซมิโคลอนตามหลัง เช่นa = bเป็นนิพจน์ แต่a = b;เป็นประโยคบอกเล่า
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Operator_associativity&oldid=1351988464 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ความสัมพันธ์ของตัวดำเนินการ

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

ตัวอย่าง

คุณสมบัติการสลับที่ (Associativity) จำเป็นเฉพาะเมื่อตัวดำเนินการในนิพจน์มีลำดับความสำคัญเท่ากัน โดยปกติแล้ว + และ - จะมีลำดับความสำคัญเท่ากัน พิจารณานิพจน์ 7 - 4 + 2 ผลลัพธ์อาจเป็น (7 - 4) + 2 = 5 หรือ ผลลัพธ์แบบแรกสอดคล้องกับกรณีที่ และเป็นแบบสลับที่ทางซ้าย...

ตัวอย่างโดยละเอียด

พิจารณานิพจน์ 5^4^3^2 ซึ่ง ^ ถือว่าเป็นตัวดำเนินการยกกำลังแบบเชื่อมโยงทางขวา ตัวแยกวิเคราะห์ที่อ่านโทเค็นจากซ้ายไปขวาจะใช้กฎการเชื่อมโยงกับสาขา เนื่องจาก เป็นการเชื่อมโยงทางขวา ^ ในลักษณะดังต่อไปนี้:

ความสัมพันธ์แบบขวาของตัวดำเนินการกำหนดค่า

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