มีเหตุผลใดที่ภาษาการเขียนโปรแกรมส่วนใหญ่ไม่มี '!>' (ไม่มากกว่า) และ '! <' (ไม่น้อยกว่า) ตัวดำเนินการหรือไม่


28

ฉันสงสัยว่ามีเหตุผลใด - หรือถ้ามันเป็นแค่อุบัติเหตุของประวัติศาสตร์ - ว่าไม่มี!>และ!<ตัวดำเนินการในภาษาการเขียนโปรแกรมส่วนใหญ่ ?

a >= b (เป็นมากกว่าหรือเท่ากับข)อาจจะเขียนเป็น!(a < b) (เป็นขไม่น้อย)a !< bที่เท่าเทียมกัน

คำถามนี้ทำให้ฉันหลงเมื่อฉันอยู่ในระหว่างการสร้างรหัสการสร้างต้นไม้แสดงออกของฉันเอง ภาษาโปรแกรมส่วนใหญ่มีa != bผู้ประกอบการสำหรับ!(a=b)ดังนั้นทำไมไม่!>และ!<?

UPDATE:

  • !<(ไม่น้อยกว่า) ออกเสียงได้ง่ายกว่า>=(มากกว่าหรือเท่ากับ)
  • !<(ไม่น้อยกว่า) พิมพ์สั้นกว่า>=(มากกว่าหรือเท่ากับ)
  • !<(ไม่น้อยกว่า) ง่ายต่อการเข้าใจ *มากกว่า>=(มากกว่าหรือเท่ากับ)

* เนื่องจากORเป็นตัวดำเนินการแบบไบนารีที่คุณสมองจำเป็นต้องใช้ตัวถูกดำเนินการสองตัว (ตัวคูณเท่ากับ) ในขณะที่ตัวNOTดำเนินการแบบเอกเทศและสมองของคุณจำเป็นต้องทำงานด้วยตัวถูกดำเนินการตัวเดียว (น้อยกว่า)


3
มันไม่จำเป็นต้องออกเสียงทุกภาษาง่ายกว่า ในภาษาเยอรมันเราพูดว่า "größer / gleich" ฉันไม่เคยได้ยิน "nicht kleiner"
Ingo

1
การถกเถียงที่เข้าใจง่ายกว่านั้นก็ไม่ได้ถือน้ำ คุณต้องใช้งานตัวถูกดำเนินการ 2 ตัวในทั้งสองกรณีเนื่องจากเป็นเรื่องปกติกับตัวดำเนินการสัมพันธ์ ยิ่งไปกว่านั้นคุณเพียงแค่สมมติว่าสมองสามารถทำงานได้ง่ายขึ้นใน 1 ตัวถูกดำเนินการแทน 2 คุณมีหลักฐานใด ๆจากเรื่องของระบบประสาทหรือไม่?
Ingo

คำตอบ:


84

ภาษา D การเขียนโปรแกรมและการขยาย DMC ของไปที่ C และ C ++ ไม่สนับสนุนผู้ประกอบการเหล่านี้ (ทั้งหมด 14 การรวมกันของพวกเขา) แต่ที่น่าสนใจ, D จะไปเลิกประกอบการเหล่านี้ส่วนใหญ่เป็นเพราะ

  1. สิ่งที่แน่นอนคือa !< b? a>=b || isNaN(a) || isNaN(b)มันเป็น !<คือไม่ได้เช่นเดียวกับ>=เพราะNaN !< NaNในขณะที่ความจริงNaN >= NaNเป็นเท็จ IEEE 754 นั้นยากที่จะควบคุมดังนั้นการใช้a !< bเพียงแค่จะทำให้เกิดความสับสนในการจัดการ NaN - คุณสามารถค้นหาตัวดำเนินการดังกล่าวใน Phobos (ไลบรารีมาตรฐานของ D) และมีการใช้งานจำนวนมากที่มีความคิดเห็นอยู่ข้างๆ
  2. ดังนั้นบางคนจะใช้มันแม้ว่าตัวดำเนินการดังกล่าวจะมีอยู่ใน D
  3. และต้องกำหนดโทเค็นอีก 8 ตัวสำหรับตัวดำเนินการที่ใช้บ่อยซึ่งทำให้คอมไพเลอร์ซับซ้อนขึ้นเพื่อผลประโยชน์เพียงเล็กน้อย
  4. และหากไม่มีตัวดำเนินการเหล่านั้นเราก็ยังคงสามารถใช้สิ่งที่เทียบเท่า!(a < b)ได้หรือถ้าคนหนึ่งชอบที่จะชัดเจนa >= b || isNaN(a) || isNaN(b)และพวกเขาก็อ่านง่ายขึ้น

นอกจากนี้ความสัมพันธ์ (≮, ≯, ≰, ≱) มักจะไม่ค่อยเห็นในวิชาคณิตศาสตร์ขั้นพื้นฐานซึ่งแตกต่างจาก!=(≠) หรือ>=(≥) ดังนั้นจึงเป็นเรื่องยากที่จะเข้าใจสำหรับคนจำนวนมาก

นี่อาจเป็นเหตุผลว่าทำไมภาษาส่วนใหญ่ไม่สนับสนุนภาษาเหล่านี้


seldomly seen in basic math- ชอบมากขึ้นไม่เคยเห็น เราเรียนรู้ย้อนกลับไปในพีชคณิตเพียงแค่พลิกไปเป็นคณิตศาสตร์ที่เทียบเท่า (โดยเฉพาะอย่างยิ่งเมื่อNaNไม่ปรากฏในคณิตศาสตร์พื้นฐาน)
Izkata

สิ่งที่จำเป็นจริงๆ IMHO คือวิธีการประกาศตัวแปรที่มีพฤติกรรมdouble ยกเว้นสำหรับNaNพฤติกรรมของพวกเขา ในหลายกรณีรหัสที่อาจทำการเปรียบเทียบชนิดใด ๆNaNจะต้องการNaNเปรียบเทียบขนาดใหญ่กว่าทุกอย่างมีขนาดเล็กกว่าทุกอย่างหรือมีข้อยกเว้นในความพยายามเปรียบเทียบ อนุญาตให้ใช้รหัสเพื่อระบุdeclarativelyว่าNaNควรจะถือว่าจะช่วยลดความจำเป็นที่จะต้องใช้รหัสความจำเป็นเพื่อให้บรรลุพฤติกรรมที่ถูกต้อง
supercat

@supercat: คุณสามารถทำให้การดำเนินงานน่านที่จะโยนข้อยกเว้นการใช้ฟังก์ชั่นเช่น<fenv.h> fesetexceptflag
kennytm

@KennyTM: ต้องตั้งค่าสถานะก่อนที่จะทำการดำเนินการและยกเลิกการตั้งค่าหลังจากที่ดูเหมือนจะลำบากและง่ายต่อการใช้งาน IEEE จากสิ่งที่ฉันเข้าใจเพิ่งแนะนำวิธีการเปรียบเทียบแบบใหม่ซึ่งจะกำหนดลำดับโดยรวมซึ่งฉันจะพิจารณาการต้อนรับหากมีการเปลี่ยนแปลงเกินกำหนด มันจะน่าสนใจเพื่อดูว่าภาษามีปฏิกิริยาอย่างไร
supercat

47

เพราะมันไม่สมเหตุสมผลเลยที่จะมีตัวดำเนินการสองตัวที่ต่างกันซึ่งมีความหมายเหมือนกัน

  • “ ไม่ยิ่งใหญ่กว่า” ( !>) เหมือนกันกับ“ น้อยกว่าหรือเท่ากับ” ( <=)
  • “ ไม่น้อยกว่า” ( !<) เหมือนกันกับ“ มากกว่าหรือเท่ากับ” ( >=)

สิ่งนี้ใช้ไม่ได้กับ "ไม่เท่ากับ" ( !=) ไม่มีโอเปอเรเตอร์ที่มีความหมายเหมือนกัน

ดังนั้นการดัดแปลงของคุณจะทำให้ภาษาซับซ้อนขึ้นโดยไม่มีประโยชน์


5
สิ่งที่เกี่ยวกับx = x + 1, x += 1และx++?

33
@dunsmoreb: ไม่มีสิ่งใดที่เหมือนกัน เพียงคนเดียวที่ทำหน้าที่วัตถุประสงค์ของ "การเพิ่มขึ้น" ความจริงที่ว่าคุณได้ยกระดับการแสดงออกอีกสองการแสดงออกเพื่อวัตถุประสงค์เดียวกันนั้นไม่เกี่ยวข้อง - พวกเขาทั้งคู่มีความกว้างมากกว่า
DeadMG

1
<>เป็นโอเปอเรเตอร์ที่มีความหมายเหมือน!=กันและ Python 2 มีทั้งคู่
krlmlr

9
@ user946850 และมีทั้งอยู่ในขณะนี้การพิจารณาอย่างกว้างขวางผิดใช้<>ถูกเลิกใช้มาเป็นเวลานานและจะถูกลบออกตั้งแต่ 3.0 (และใจคุณ, รุ่น 2.x สุดท้ายที่เคย 2.7 ได้รับการปล่อยตัวในช่วงฤดูร้อน 2010)

3
@svick ซึ่งทำให้ตัวดำเนินการ ++ ยิ่งกว่าเดิมมันจะป้องกันโปรแกรมเมอร์ C # เหล่านั้นไม่ให้มาที่นี่สร้างสมมติฐานที่สมเหตุสมผลเกี่ยวกับพฤติกรรมของโปรแกรมจากนั้นขโมยงานโปรแกรมเมอร์ C ++ ของฉัน!

10

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

แม้จะอยู่ใน 3 คุ้มค่าตรรกะเช่น ANSI SQL, not x < yเทียบเท่าของx >= yที่พวกเขาทั้งสองให้NULLถ้าอย่างใดอย่างหนึ่งxหรือเป็นy NULLแต่มีที่ไม่ได้มาตรฐาน ANSI ภาษาที่สอดคล้องกับ SQL ที่มันไม่เทียบเท่าและพวกเขาจะมี!<


10
อย่างไรก็ตามมักจะไม่เทียบเท่าเมื่อใช้ตัวเลขทศนิยม ยกตัวอย่างเช่นการเปรียบเทียบอะไรกับNaNเป็นเท็จดังนั้นในขณะที่!(2 < NaN) == true (2 >= NaN) == false
ไวยากรณ์

@hammar: ทรู แต่ที่แท้จริงของความสัมพันธ์ทางคณิตศาสตร์ทั่วNaNs พวกเขาทั้งหมดหยุดทำงานตามปกติ
Nicol Bolas

@hammar - นี่เป็นความผิดจุดลอยตัวเป็นเพียงการใช้งาน Ord อย่างไม่ถูกต้องดังนั้นการพูด อย่างไรก็ตามนี่ไม่ใช่ปัญหาใหญ่เนื่องจากไม่มีใครบังคับให้เราดำเนินการa !< b = not (a < b)เราสามารถพูดได้ว่า (! <) = (> =)
Ingo

8

Transact-SQL มี!> (ไม่มากกว่า)และ! <(ไม่น้อยกว่า)ตัวดำเนินการ

นอกจากคุณแล้วใครบางคนที่Sybase Microsoft ก็คิดว่ามันเป็นความคิดที่ดีเช่นกัน เช่นเดียวกับ Microsoft Bob! :)


นี่ไม่ใช่สิ่งที่เพิ่มเข้ามาในปี 2005 ใช่ไหม
JeffO

5
มีคนที่ไม่ได้รับการแนะนำมากมายในโลกนี้ที่ไม่ได้อยู่คนเดียวในการเห็นพ้องกันเป็นเอกฉันท์! = ความถูกต้อง

@JeffO แล้วเราควรตำหนิ Microsoft ไม่ใช่ Sybase เหรอ?
yannis

น่าสนใจ ฉันอยากรู้เรื่องเบื้องหลังนี้
surfasb

@ surfasb Yeap ฉันด้วย ฉันเดาว่ามันเป็นเพียงน้ำตาลวากยสัมพันธ์ไม่มีอะไรพิเศษเกี่ยวกับมัน
yannis

4

ฉันคิดว่าคำตอบนั้นง่าย ๆ ว่าไม่มีความจำเป็นสำหรับ!<โอเปอเรเตอร์ ในขณะที่คุณชี้ให้เห็นในคำถามของคุณมีอยู่แล้ว>=และ<=พร้อมกับความเป็นไปได้ที่จะปฏิเสธการแสดงออกที่มีอยู่ดังนั้นทำไมจึงเพิ่มผู้ประกอบการอื่น?


ฉันยอมรับว่าไม่มีจุดใดในการเพิ่มตัวดำเนินการที่ทำสิ่งเดียวกัน แต่ทำไม "พวกเขา" เลือก> = แทนที่จะเป็น! <มันง่ายกว่าที่จะออกเสียงไม่ใช่ LESSER แล้วยิ่งใหญ่กว่าหรือเท่ากับมันสั้นกว่าสำหรับพิมพ์ สมองที่จะเข้าใจ
Alex Burtsev

!<พิมพ์ไม่สั้นกว่า>=หรือฉันขาดอะไรไป?
ไบรอัน Oakley

ฉันหมายถึงการแสดงข้อความ (ออกเสียงข้อความ)
Alex Burtsev

4

จากRFC 1925

ความสมบูรณ์แบบไม่ถึงเมื่อไม่มีอะไรเหลือให้เพิ่ม แต่เมื่อไม่มีอะไรเหลือให้เอาไป

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

ลองใช้ภาษาที่มีความเป็นไปได้ที่โอเปอร์เรเตอร์คุณจะมีโอเปอเรเตอร์ตัวอื่นที่จะโอเวอร์โหลด พิจารณาความสับสนเมื่อใดbool operator<=และbool operator!>จะคืนสิ่งต่าง ๆ ได้อย่างไร (ใช่ฉันรู้ว่าเราสามารถทำการเปรียบเทียบที่ไม่สอดคล้องกันได้แล้ว)

สุดท้ายคิดว่าภาษาที่วิธีการหรือผู้ประกอบการที่มีการกำหนดทวีคูณ (ทับทิม - ฉันกำลังมองหาคุณ ) และคุณมีหนึ่งโปรแกรมเมอร์ที่ใช้ <= ในขณะที่อีกใช้!> และคุณมีหลายรูปแบบรหัสสำหรับการแสดงออกที่เหมือนกัน


ใช่ มันเป็นหลักการของ Parsimony ทางวิทยาศาสตร์
luser droog

3

! <เท่ากับ> = ทีนี้ทำไมเราถึงมีอันดับที่สองไม่ใช่อันดับแรกเพราะทุกภาษาใช้ตัวดำเนินการเชิงบวกก่อนแล้วจึงเข้าหาตัวดำเนินการเชิงลบเช่นเดียวกับการใช้> = ยังครอบคลุม! <และ <= ครอบคลุม!> ดังนั้นผู้สร้างภาษา และคิดว่าพวกเขาจะซ้ำซ้อนและข้ามพวกเขา

พยายามใช้กรณีที่เป็นบวกก่อนแล้วไปที่กรณีที่เป็นลบ (:) การคิดเชิงบวกฉันมุมมองส่วนตัวเท่านั้น)


2

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

ดังนั้นในการเขียนโปรแกรมภาษาเรามักจะได้รับสัญลักษณ์ที่ดูเหมือน not สำหรับไม่เท่ากับ ( !=หรือ/=ยกเว้นบางคนถ้าเป็นแฟนซี<>หรือผู้ประกอบการต้นฉบับ)

และสิ่งที่ดูเหมือน like และ≥ ( <=และ>=)


Btw ฉันไม่เห็นด้วยกับการยืนยันของคุณที่ไม่ง่ายต่อการเข้าใจและเหตุผลเกี่ยวกับตอนนั้นหรือ ในวิชาคณิตศาสตร์การพิสูจน์ที่เกี่ยวข้องกับการปฏิเสธหลายครั้ง (เช่นลดการไร้สาระ) มักจะขมวดคิ้วหากมีทางเลือกอื่นที่ตรงกว่า นอกจากนี้ในกรณีการสั่งซื้อความรู้พื้นฐานที่เรามี (และที่ใช้เมื่อคิดหรือพิสูจน์บางอย่าง) คือ tricotomy ระหว่าง <, = และ> ดังนั้นใด ๆ ! คำสั่ง <อาจจะต้องถูกแปลงเป็น> = ถ้าคุณต้องการทำ สิ่งที่มีประโยชน์กับมัน


2

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

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

... อาจจะเป็น


1

ฉันคิดว่าฉันเห็นบางภาษาเมื่อไม่กี่ปีที่ผ่านมาแทนที่จะใช้!=ตัวดำเนินการ (ไม่เท่ากับ) <>มีการใช้บางอย่าง จำชื่อของพวกเขาไม่ได้ ...

ผมคิดว่ามันยากที่จะอ่าน!(a < b)หรือกว่าa !< b a >= bอาจเป็นเหตุผลว่าทำไม!<ไม่ใช้ (มันดูน่าเกลียดในความคิดของฉัน)


1
<>คือ (เคยเป็น) ส่วนใหญ่ใช้โดยภาษาพื้นฐาน, SQL, และภาษาปาสกาล
ยานนิส

@ Yanis Rizos ขอบคุณสำหรับการเตือน พวกเขาสอนเรา Pascal ในโรงเรียนมัธยมและนั่นคือสิ่งที่ฉันเห็น :)
Radu Murzea

2
Python 2 มี<>เช่นกันแม้ว่ามันจะถูกลบใน 3
Daniel Lubarov

จากมุมมองเชิงตรรกะ!=ทั่วไปมากกว่า<>เนื่องจากคุณสามารถมีสิ่งต่าง ๆ (เช่นตัวเลขที่ซับซ้อน) ซึ่งความเท่าเทียมกันได้รับการกำหนดไว้อย่างดี แต่ไม่มีการสั่งซื้อที่มีประโยชน์จริง ๆ
David Thornley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.