เหตุใดภาษาต่างๆจึงไม่รวมความหมายไว้เป็นตัวดำเนินการเชิงตรรกะ


60

อาจเป็นคำถามที่แปลก แต่ทำไมไม่มีความหมายเป็นตัวดำเนินการเชิงตรรกะในหลายภาษา (Java, C, C ++, Python Haskell - แม้ว่าสุดท้ายจะมีตัวดำเนินการที่ผู้ใช้กำหนดไว้เล็กน้อยเพื่อเพิ่มมัน)? ฉันพบความหมายเชิงตรรกะที่ชัดเจนมากขึ้นในการเขียน (โดยเฉพาะอย่างยิ่งในการอ้างหรือการแสดงออกที่เหมือนยืนยัน) แล้วปฏิเสธด้วยหรือ:

encrypt(buf, key, mode, iv = null) {
    assert (mode != ECB --> iv != null);
    assert (mode == ECB || iv != null);
    assert (implies(mode != ECB, iv != null)); // User-defined function
}

28
เพราะมันไม่ได้ใส่ใน C; ถ้ามันถูกวางไว้แล้ว C ++, Java และ C # จะมีมัน
m3th0dman

4
แต่ C ไม่มีในทางกลับกันเพราะมันไม่ใช่ภาษาทั่วไปของภาษาประกอบ ในขณะที่ชุดการเรียนการสอนทั้งหมดที่ฉันรู้รวมถึงและหรือไม่ฉันรู้ว่าไม่มีใครรวมถึงนัย - ไม่ต้องสงสัยเลยว่าใครบางคนจะพร้อมที่จะบอกฉันเกี่ยวกับชุดคำสั่งที่คลุมเครือบางอย่างที่ไม่นาน ...
Jack Aidley

4
อาจถูกพิจารณาว่าซ้ำซ้อนเพราะ (1) น้อยกว่า "^", "v", "~", (2) โดยจะประหยัดการพิมพ์เพียงเล็กน้อยเนื่องจาก "A => B" เทียบเท่ากับ "~ A v B" .
Giorgio

4
ภาษาที่จัดการกับการสร้างเชิงตรรกะมีแนวโน้มที่จะมีมัน ส่วนใหญ่ในกลุ่มคนเหล่านี้คือการเปิดฉาก

9
ฉันประหลาดใจที่คุณคิดว่าassert# 1 ชัดเจนกว่า # 2 ฉันจ้องที่ # 1 บางครั้งและยังไม่เห็นว่าพฤติกรรมของมันจะถูกนำมาใช้อย่างชาญฉลาดได้อย่างไร (โดยเฉพาะอย่างยิ่งกับการ!=พลิกตรรกะเป็นพิเศษ)
Chris Burt-Brown

คำตอบ:


61

มันอาจมีประโยชน์ที่จะมีบางครั้งไม่ต้องสงสัยเลย มีหลายจุดที่โต้แย้งกับตัวดำเนินการดังกล่าว:

  • ตัวละคร-และ>มีคุณค่าทั้งในการแยกและรวม หลายภาษาใช้ภาษาเหล่านี้เพื่อแปลสิ่งอื่น ๆ (และหลายคนไม่สามารถใช้ชุดอักขระ Unicode สำหรับไวยากรณ์ได้)
  • ความหมายคือการตอบโต้ได้ง่ายมากแม้แต่กับคนที่มีเหตุผลเช่นโปรแกรมเมอร์ ความจริงที่ว่าสามในสี่ของตารางความจริงนั้นtrueน่าประหลาดใจที่หลายคน
  • ตัวดำเนินการเชิงตรรกะอื่น ๆ ทั้งหมดมีความสมมาตรซึ่งจะทำให้->เกิดข้อยกเว้นสำหรับ orthogonality
  • ในขณะเดียวกันจะมีวิธีแก้ปัญหาง่าย: ผู้ประกอบการใช้งานและ!||
  • ความหมายคือการใช้อย่างกว้างขวางมักจะน้อยกว่าตรรกะ/andor

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


22
จุดแรกของคุณโต้แย้งเพียงการใช้ '->' เป็นสัญลักษณ์สำหรับโอเปอเรเตอร์ไม่ใช่การมีโอเปอเรเตอร์ คนอื่น ๆ เป็นจุดที่ดี
AShelly

14
"ในเวลาเดียวกันมีวิธีแก้ปัญหาง่าย ๆ : ใช้! และ &&.": อันที่จริงวิธีที่ง่ายที่สุดในการจำลอง "->" (หรือ "=>" เนื่องจากเป็นเรื่องธรรมดามากในคณิตศาสตร์) คือการใช้!และ||ไม่!และ&&: A -> Bเทียบเท่ากับซึ่งเทียบเท่ากับ!A || B !(A && !B)
Giorgio

22
"ข้อเท็จจริงที่ว่าสามในสี่ของรายการความจริงเป็นสิ่งที่น่าประหลาดใจจริง ๆ ที่หลาย ๆ คน" วัด ฉันรู้จักตัวดำเนินการอื่นที่มีคุณสมบัติเดียวกันซึ่งใช้บ่อย ...
l0b0

9
@ l0b0 ฉันเป็นโปรแกรมเมอร์ที่เรียน CS แต่มันนานมาแล้ว ฉันลืมไปแล้วว่า "นัย" เป็นการดำเนินการอย่างเป็นทางการกับตัวถูกดำเนินการสองตัวที่คืนค่าความจริงดังนั้นตอนแรกฉันก็สับสนกับธรรมชาติของคำถามนี้ ในการพูดทุกวันฉันจะใช้ "นัย" เมื่อตัวถูกดำเนินการตัวแรกรู้แล้วว่าเป็นจริง ("X เป็นจริงดังนั้น Y ต้องเป็นจริง") หลังจากหนึ่งนาทีฉันจำได้ว่า "นัย" เป็นทางการทำงานอย่างไร แต่ความจริงก็ยังคงอยู่ - แม้สำหรับคนที่เคยศึกษาตรรกะอย่างเป็นทางการความตั้งใจไม่ชัดเจนสำหรับฉัน และถ้าฉันไม่เคยศึกษามันก็คงไม่สมเหตุสมผล
Ben Lee

5
(a) ใน C -> ใช้เป็นตัวดำเนินการ ไม่มีใครบ่นเรื่องนั้น ฉันจะใช้ => ต่อไป (b) ตอบโต้ได้ง่ายกับใคร นิยามของความหมายก็คือนิยาม (c) การลบไม่ใช่การสลับ ไม่มีใครบ่นเรื่องนั้น (d) ฉันคิดว่าคุณหมายถึง! และ || เพราะความสำคัญ (และ) ก็มักจะต้องการ อาร์กิวเมนต์เดียวกันสามารถใช้กับ && หรือ ||; เลือกของคุณ (e) อาจเป็นเพราะมันไม่ได้อยู่ในภาษาส่วนใหญ่ การใช้งานหลายอย่างของ || อาจจะรัดกุมและ (สำหรับฉันอย่างน้อย) ถูกแทนที่โดยสัญชาตญาณโดยนัย
Theodore Norvell

54

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

นี่คือข้อเสนอที่ 1 ของบทที่สองจาก George Boole การตรวจสอบกฎหมายความคิด (1854) :

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

1 สัญลักษณ์ตามตัวอักษรเช่น x, y, & c. ซึ่งเป็นตัวแทนของสิ่งต่าง ๆ ตามแนวคิดของเรา

ครั้งที่ 2 สัญญาณของการดำเนินงานในฐานะ +, -, ×, หมายถึงการดำเนินงานของจิตใจโดยที่แนวคิดของสิ่งต่าง ๆ จะรวมกันหรือแก้ไขเพื่อสร้างแนวความคิดใหม่ที่เกี่ยวข้องกับองค์ประกอบเดียวกัน

3 สัญลักษณ์ประจำตัว =.

และสัญลักษณ์ของลอจิกเหล่านี้อยู่ในการใช้งานของพวกเขาภายใต้กฎหมายที่แน่นอนเห็นด้วยกับบางส่วนและแตกต่างจากกฎหมายของสัญลักษณ์ที่สอดคล้องกันในวิทยาศาสตร์ของพีชคณิต

เครื่องหมาย + ของ Boole แสดงถึง "การดำเนินการของจิตใจ" ที่เหมือนกันในทุกวันนี้ที่เราจำได้ว่าเป็นทั้งบูลีน´or´ และสหภาพของเซต ในทำนองเดียวกันสัญญาณ - และ×สอดคล้องกับการปฏิเสธบูลีนของเรา, เติมเต็มของเซต, บูลีน ´และ´ และจุดตัดของเซต


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

3
1. ขึ้นอยู่กับคำจำกัดความ เป็นไปได้ที่จะกำหนดหรือเป็นa || b = !(!a && !b)(ฉันได้พบหรือเป็นผู้ประกอบการที่ได้รับมาในตรรกะ) 2. เหตุผลที่ทำมักจะทำให้การเหนี่ยวนำง่ายขึ้นฉันเชื่อว่า (เรารู้ว่าผู้ประกอบการที่ได้รับเป็นเพียงทางลัดดังนั้นเราไม่จำเป็นต้องแยกกรณีสำหรับพวกเขา) @ GlenH7: เงื่อนไข "ไม่สนใจ" คืออะไร เป็นเช่นเดียวกับa --> b !a || b
Maciej Piechotka

3
นอกจากนี้ - เรามีตัวดำเนินการอื่น ๆ ที่ได้รับเช่น xor ( !=) nxor ( ==) ...
Maciej Piechotka

5
ที่จริงแล้วคุณสามารถได้รับทุกอย่างจากทั้ง NAND !(a && b)หรือ !(a || b)NOR ตัวอย่างเช่นNOT a == a NAND a, ,a AND b == NOT(a NAND b) a OR b == (NOT a) NAND (NOT b)แต่การให้บริการตัวดำเนินการ NAND เพียงอย่างเดียวทำให้คุณอยู่ในขอบเขตของภาษาที่ลึกลับ (ซึ่งเหมาะอย่างยิ่งกับชื่อผู้ใช้ของผู้ตอบ ;-))
Stefan Majewsky

1
@Stefan: คุณสามารถได้รับทุกอย่างจาก IMPL
Mason Wheeler

37

UPDATE: คำถามนี้เป็นเรื่องของการบล็อกของฉันในพฤศจิกายน 2015 ขอบคุณสำหรับคำถามที่น่าสนใจ!


Visual Basic 6 (และ VBScript) มีImpและEqvตัวดำเนินการ ไม่มีใครใช้มัน ทั้งสองถูกลบใน VB.NET; ความรู้ของฉันไม่มีใครบ่น

ฉันทำงานกับทีมคอมไพเลอร์ Visual Basic (เป็นฝึกงาน) ตลอดทั้งปีและไม่เคยสังเกตว่า VB มีผู้ให้บริการเหล่านั้นด้วยซ้ำ ถ้าฉันไม่ได้เป็นคนเขียน VBScript คอมไพเลอร์และดังนั้นจึงต้องทดสอบการใช้งานของพวกเขาฉันอาจจะไม่ได้สังเกตเห็นพวกเขา หากคนที่อยู่ในทีมคอมไพเลอร์ไม่ทราบเกี่ยวกับคุณลักษณะและไม่ได้ใช้งานสิ่งนั้นจะบอกคุณเกี่ยวกับความนิยมและประโยชน์ของคุณลักษณะ

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

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


IMP กลับไปเป็นผู้ดำเนินการในวัน GWBASIC ฉันจำได้ตั้งแต่ปี 1979
zarchasmpgmr

1
ฉันอ่านแล้วว่า IMPL มีประโยชน์มากสำหรับสัญญาโค้ด (ซึ่ง VB ไม่ได้มี.)
เมสันล้อ

3
โปรแกรมเมอร์ VBScript อาจเป็นกลุ่มที่มีโอกาสน้อยที่สุดที่จะใช้ตัวดำเนินการดังกล่าว ฉันต้องการในตอนนี้ว่า PowerShell มีตัวดำเนินการนัยดังนั้นฉันสามารถใช้[switch]พารามิเตอร์ตัวกรองได้ง่ายขึ้นและถูกต้องมากขึ้น
อธิการ

ฉันจำ IMP จาก DEC BASIC ได้ EQVผมจำไม่ได้ โอเปอเรเตอร์ที่ฉันต้องการมักจะเป็น "ไม่ใช่" ซึ่งจะโปรโมตโอเปอเรเตอร์มือขวาก่อนที่จะปฏิเสธ ดังนั้น0xABCD12345678ul ~& 0x00200000uจะให้ผลตอบแทน 0xABCD12145678ul มากกว่า 0x12145678ul
supercat

19

ฉันเดาได้ แต่เหตุผลอาจเป็นเพราะมีวิธีแก้ปัญหาที่ค่อนข้างง่ายและอ่านได้ ลองพิจารณาตัวอย่างของคุณ:

if (mode != ECB) assert (iv != null);

assert (mode != ECB --> iv != null);  // <-- that's only one character shorter

หากคุณต้องการนิพจน์สามารถใช้ตัวดำเนินการแบบอินไลน์ได้ในภาษาส่วนใหญ่ (มักเรียกว่าตัวดำเนินการที่ประกอบไปด้วยสามส่วน) สามารถใช้ได้ จริงอยู่ที่นี่ไม่ได้สง่างามเท่าA --> Bแต่จำนวนกรณีการใช้งานอาจไม่แสดงให้เห็นถึงการเพิ่ม (และการบำรุงรักษา!) ตัวดำเนินการอื่น:

assert (mode != ECB ? iv != null : true);

2
ณ วันที่ยืนยัน - มีเหตุผลที่ดีคือ คนแรกจะผลิต (ในการใช้งานหลายอย่าง) ข้อความ "ความล้มเหลวในการยืนยัน: iv! = null" ในขณะที่ "ความล้มเหลวในการยืนยันที่สอง: โหมด! = ECB -> iv! = null"
Maciej Piechotka

2
+1, ฉันกำลังจะถามคำถามแบบเดียวกันนี้ (เนื่องจากฉันไม่คุ้นเคยกับ "ความหมาย" มากไปกว่านี้มันก็ไม่เกิดขึ้นแบบวันต่อวัน) ifคำสั่งไกลชัดเจนเพียงเกี่ยวกับทุกคน
Izkata

12

ไอเฟลมีความหมาย

มันมีมากกว่านั้นจริงๆ มีผู้ประกอบการกึ่งเข้มงวดจำนวนมากรวมทั้งเข้มงวด

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

ปรากฎว่าเมื่อคุณมีภาษากับโอเปอเรเตอร์บูลีนดังกล่าวและคุณรู้วิธีการออกแบบกับพวกเขาและใช้พวกเขาแล้วคุณจะใช้พวกเขา

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

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

คนคอมไพเลอร์ต้องสำรองทฤษฎีเขียนสัญกรณ์ภาษาที่แนะนำหรือบอกเป็นนัยโดยทฤษฎี (เช่น Object Oriented Theory) โดยไม่คำนึงถึงสิ่งที่โปรแกรมเมอร์ไม่ได้คิดหรือถาม จากนั้นอาจารย์อาจารย์และผู้เชี่ยวชาญด้านอื่น ๆ จำเป็นต้องฝึกอบรมความคิดเล็ก ๆ น้อย ๆ อย่างเชี่ยวชาญบนพื้นฐานของทฤษฎีดิบและไม่ใช่ "ทฤษฎีผ่านทางภาษาเลนส์" เมื่อสิ่งนี้เกิดขึ้นผู้คนจะตื่นขึ้นมาทันทีและตระหนักถึงสิ่งที่พวกเขาหายไปและสิ่งที่เกิดขึ้นกับพวกเขา

ตอนนี้ - มีทฤษฎีมากมายที่ปลอมตัวเป็น Object Oriented แต่เป็นเพียง OO ผ่านกระจกมืด ๆ ของ [เลือกภาษาของคุณ] เราไม่สามารถอ่านหนังสือ "ทฤษฎี" ส่วนใหญ่ใน OO ได้เพราะพวกเขาต้องการตีความว่าทฤษฎีนี้ผ่านเลนส์ของบางภาษา เท็จทั้งหมดและไม่ถูกต้อง มันจะเหมือนกับการสอนคณิตศาสตร์โดยอิงกับเครื่องคิดเลขหรือกฎสไลด์ของฉัน ไม่มีใครยอมให้ความเป็นจริงสอนสิ่งใดสิ่งหนึ่งเกี่ยวกับตัวเองแล้วใช้สัญกรณ์เพื่ออธิบายสิ่งที่ผู้สังเกตการณ์คนหนึ่งเรียกว่า "วิทยาศาสตร์" คลุกเคล้าอื่น ๆ ที่เรียกว่า OO-based-on-language-X เบ้จนแทบจะไม่ได้เป็นตัวแทนของความเป็นจริง

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

จากนั้นคุณจะเริ่มได้รับความหมายและ "นัย" ไม่เพียงมีประโยชน์ แต่สง่างามและเท่ห์มาก!

ขอให้มีความสุข!


7

Python มีตัวดำเนินการที่เกี่ยวข้องในลักษณะที่ซ่อนอยู่

โอเปอเรเตอร์ที่น้อยกว่าหรือเท่ากับถูกโหลดมากเกินไปเพื่อยอมรับค่าบูลีน เป็นผลให้เราสามารถใช้มันเป็นตัวดำเนินการที่เกี่ยวข้อง

พิสูจน์ตามตัวอย่าง (รหัสไพ ธ อน):

print (False <= False) # This will print True.
print (False <= True)  # This will print True.
print (True <= False)  # This will print False.
print (True <= True)   # This will print True.

จำตารางความจริงของตัวดำเนินการที่เกี่ยวข้องคือ:

LEFT RIGHT RESULT
F    F     T
F    T     T
T    F     F
T    T     T

2
นี่เป็นสิ่งที่ยอดเยี่ยม แต่น่าเสียดายที่มีคุณสมบัติความเข้มงวดที่ไม่ถูกต้อง: f() implies g()ไม่ควรประเมินg()หากf()เป็นFalseเช่นนั้น แต่<=จะประเมินg()ในกรณีนี้
จอน Purdy

2
@ จอน Purdy - การประเมินผลแบบลัดวงจรพูดอย่างเคร่งครัดเป็นคุณลักษณะเสริมของผู้ประกอบการไบนารี ดังนั้นในทางเทคนิคนี่เป็นการดำเนินการตามกฎหมายอย่างสมบูรณ์แบบของผู้ดำเนินการที่เกี่ยวข้อง ที่ถูกกล่าวว่าฉันสงสัยจริงๆว่ากุยโดแวนรอสุมามตั้งใจให้สิ่งนี้เป็นตัวดำเนินการโดยปริยาย นี่เป็นเพียงมุมมองของการเปรียบเทียบบูลีน
Mackenzie

แน่นอนว่าฉันกำลังบอกว่ามันเป็นข้อสังเกตที่น่าสนใจ แต่ไม่ใช่สิ่งที่คุณควรใช้ในโปรแกรมจริงเพราะมันไม่ใช่การลัดวงจรและอาจทำให้ใครบางคนประหลาดใจถ้าพวกเขาคาดหวังว่าdid_all_possible_stuff = x.do_required_stuff() and (x.supports_optional_stuff() <= x.do_optional_stuff())จะทำงาน
จอน Purdy

2
ใช้งานได้ใน C และ C ++ เช่นกัน
Ben Voigt

5

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


2

สำหรับฉันปัญหาใหญ่ที่มีนัยมาถึงเมื่อเงื่อนไขเริ่มต้นเป็นเท็จ ตัวอย่างเช่น: "ถ้าดวงอาทิตย์เป็นสีเขียวแสดงว่าฉันเป็นค้างคาวผลไม้" ความจริง!

ในตรรกะอย่างเป็นทางการมันจะทำงานเพื่อกำหนด "True" ให้กับค่าเมื่อเงื่อนไขของความหมายไม่ตรง แต่ในการเขียนโปรแกรมนั้นอาจนำไปสู่ผลลัพธ์ที่ตอบโต้ได้ง่ายและน่าประหลาดใจ

ฉันคิดว่าตัวอย่างที่ @Hezi ให้ไว้เหนือ:

if (sun.color() == "green") then assert(me.species() == "fruitbat")

ง่ายต่อการเข้าใจและมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลงเนื่องจากการเข้าใจผิดตรรกะ

ในบริบทของการทดสอบฉันจะหยุดทันทีที่สมมติฐานของฉันเป็นเท็จ:

assert(sun.color() == "green")
assert(me.species() == "fruitbat")

ดังนั้นถึงจุดของ @Eric Lippert ในฐานะโปรแกรมเมอร์ฉันไม่รู้ว่าเมื่อไหร่ฉันจะใช้โอเปอเรเตอร์นัย พฤติกรรม "False is True" ดูเหมือนว่ามีประโยชน์ในบริบทของคณิตศาสตร์ตรรกะอย่างเป็นทางการ แต่อาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิดในตรรกะของโปรแกรม

...

ไม่มีใครพูดถึงคำว่า "?" ทั่วไป โอเปอเรเตอร์โดยที่ "A? B: จริง" เหมือนกับ "นัย" แต่ในขณะที่ตรรกะอย่างเป็นทางการกำหนดให้เป็นจริงกับเงื่อนไข "else" "?" ช่วยให้นักพัฒนาซอฟต์แวร์กำหนดอย่างชัดเจน

ในตรรกะอย่างเป็นทางการการใช้งาน "จริง" ออกมา แต่ในการเขียนโปรแกรมหากเงื่อนไขเป็นเท็จคำตอบที่ดีกว่าคือ "โมฆะ" หรือ "โมฆะ" หรือ "ข้าม" หรืออาจเป็นเท็จ

ฉันคิดว่าใครบางคนจะต้องทำในกรณีที่ทำไม "นัย" เป็นตัวดำเนินการที่มีประโยชน์มากกว่า "?" หรือ "ถ้า" คำสั่งหรือเพียงแค่การไหลของโปรแกรมปกติ


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