Apakah ada alasan mengapa sebagian besar bahasa pemrograman tidak memiliki operator '!>' (Tidak lebih besar dari) dan '! <' (Tidak kurang dari)?


28

Saya bertanya-tanya apakah ada alasan - atau jika itu hanya kebetulan sejarah - bahwa tidak ada !>dan !<operator di sebagian besar bahasa pemrograman?

a >= b (a OR lebih besar sama dengan b) dapat ditulis sebagai !(a < b) (a TIDAK lebih kecil b) , itu sama dengan a !< b.

Pertanyaan ini muncul ketika saya berada di tengah pengkodean pembuat pohon ekspresi saya sendiri. Sebagian besar bahasa pemrograman memiliki a != boperator !(a=b), jadi mengapa tidak !>dan !<?

MEMPERBARUI:

  • !<(tidak lebih kecil) lebih mudah diucapkan daripada >=(lebih besar atau sama dengan)
  • !<(tidak lebih kecil) lebih pendek untuk mengetik daripada >=(lebih besar atau sama dengan)
  • !<(tidak lebih kecil) lebih mudah dipahami * daripada >=(lebih besar atau sama dengan)

* karena ORoperator biner, otak Anda perlu mengoperasikan dua operan (parutan, sama dengan), sedangkan NOToperator unary dan otak Anda perlu beroperasi hanya dengan satu operan (lebih kecil).


3
Ini tidak selalu lebih mudah untuk diucapkan dalam setiap bahasa. Dalam bahasa Jerman, misalnya, kita mengatakan "größer / gleich", saya belum pernah mendengar "nicht kleiner".
Ingo

1
The mudah untuk memahami argumen tidak menahan air baik. Anda harus mengoperasikan 2 operan dalam kedua kasus, karena ini normal dengan operator relasional. Selain itu, Anda hanya cukup berasumsi bahwa otak dapat beroperasi lebih mudah pada 1 operan bukannya 2. Apakah Anda memiliki apa bukti untuk itu dari bidang ilmu saraf?
Ingo

Jawaban:


84

The bahasa pemrograman D dan ekstensi DMC ke C dan C ++ melakukan mendukung operator ini (ke-14 kombinasi dari mereka), tapi menarik, D akan mencela operator ini , terutama disebabkan

  1. apa sebenarnya a !< b? Itu a>=b || isNaN(a) || isNaN(b). !<adalah tidak sama dengan >=, karena NaN !< NaNadalah sementara benar NaN >= NaNadalah palsu. IEEE 754 sulit dikuasai, jadi menggunakan a !< bhanya akan menyebabkan kebingungan atas penanganan NaN - Anda dapat mencari operator tersebut di Phobos (perpustakaan standar D), dan cukup banyak penggunaan memiliki komentar di sampingnya untuk mengingatkan pembaca yang terlibat NaN,
  2. oleh karena itu, beberapa orang akan menggunakannya, bahkan jika ada operator seperti di D
  3. dan kita harus mendefinisikan 8 token lagi untuk operator yang jarang digunakan ini, yang memperumit kompiler untuk sedikit manfaat,
  4. dan tanpa operator itu, orang masih bisa menggunakan yang setara !(a < b), atau jika orang suka secara eksplisit a >= b || isNaN(a) || isNaN(b),, dan mereka lebih mudah dibaca.

Selain itu, hubungan (≮, ≯, ≰, ≱) jarang terlihat dalam matematika dasar, tidak seperti !=(≠) atau >=(≥), sehingga sulit untuk dipahami bagi banyak orang.

Ini mungkin juga alasan mengapa sebagian besar bahasa tidak mendukungnya.


seldomly seen in basic math- lebih seperti, tidak pernah terlihat. Kita belajar kembali dalam aljabar untuk hanya membalikkannya ke yang setara secara matematis (terutama karena NaNtidak muncul dalam matematika dasar)
Izkata

Yang benar-benar dibutuhkan IMHO adalah cara mendeklarasikan variabel yang berperilaku sebagai double pengecualian untuk NaNperilaku mereka . Dalam banyak kasus, kode yang mungkin melakukan perbandingan dengan apa NaNpun ingin memiliki NaNperbandingan lebih besar dari segalanya, memilikinya membandingkan lebih kecil dari segalanya, atau melemparkan pengecualian pada upaya perbandingan. Mengizinkan kode untuk menentukan secara deklaratif bagaimana NaNseharusnya dianggap akan mengurangi kebutuhan untuk menggunakan kode imperatif untuk mencapai perilaku yang benar.
supercat

@supercat: Anda bisa membuat operasi NaN untuk melempar pengecualian menggunakan <fenv.h>fungsi seperti fesetexceptflag.
kennytm

@ KennyTM: Harus mengatur bendera sebelum melakukan operasi dan menghapusnya setelah tampak menjengkelkan dan rawan masalah, dan itu tidak membahas kemungkinan ingin memaksakan total order. IEEE dari apa yang saya pahami baru saja memperkenalkan beberapa metode perbandingan baru yang akan memberlakukan total order, yang saya anggap sebagai sambutan jika perubahan yang terlambat; akan menarik untuk melihat bagaimana bahasa bereaksi.
supercat

47

Karena tidak masuk akal memiliki dua operator berbeda dengan makna yang persis sama.

  • "Tidak lebih besar" ( !>) persis sama dengan "lebih rendah atau sama" ( <=)
  • "Tidak lebih kecil" ( !<) persis sama dengan "lebih besar atau sama" ( >=)

Ini tidak berlaku untuk "tidak sama dengan" ( !=), tidak ada operator dengan arti yang sama.

Jadi, modifikasi Anda akan membuat bahasa lebih rumit tanpa manfaat.


5
Bagaimana x = x + 1, x += 1dan x++?

33
@dunsmoreb: Tidak ada yang sama. Hanya satu yang memiliki tujuan "kenaikan". Fakta bahwa Anda telah memanfaatkan dua ekspresi lainnya untuk melayani tujuan yang sama tidak relevan - keduanya jauh lebih umum.
DeadMG

1
<>adalah operator dengan arti yang sama dengan !=, dan Python 2 memiliki keduanya.
krlmlr

9
@ user946850 Dan setelah keduanya kini secara luas dianggap kesalahan, penggunaan <>telah usang untuk waktu yang lama dan itu dihapus sejak 3,0 (dan pikiran Anda, yang terakhir 2.x rilis pernah , 2,7, dirilis pada musim panas 2010).

3
@vick Yang membuat operator ++ bahkan lebih cemerlang, itu akan mencegah para programmer C # datang ke sini, membuat asumsi rasional tentang perilaku program, kemudian mencuri pekerjaan programmer C ++ saya!

10

!<identik dengan >=. Kemudian hanyalah cara mengetik simbol matematika yang terdefinisi dengan baik . Anda benar bahwa "tidak kurang dari" digunakan dalam bahasa lisan, namun itu bahasa sehari-hari dan dapat ambigu (dapat ditafsirkan atau disalahartikan sebagai >). Di sisi lain pemrograman dan matematika menggunakan terminologi yang jelas dan tidak ambigu.

Bahkan dalam logika 3-nilai, seperti ANSI SQL, not x < yadalah setara x >= y, karena keduanya memberi NULLjika salah xatau yyang NULL. Namun, ada dialek SQL yang tidak sesuai dengan ANSI, yang tidak setara, dan memang ada!< .


10
Namun, mereka biasanya tidak setara ketika menggunakan angka floating-point. Misalnya, membandingkan sesuatu dengan NaNitu salah, jadi !(2 < NaN) == true, sementara (2 >= NaN) == false.
hammar

@hammar: Benar, tapi itu berlaku untuk semua hubungan aritmatika NaNdi sekitar s. Mereka semua berhenti bersikap normal.
Nicol Bolas

@hammar - ini adalah kesalahan floating-points, hanya saja tidak benar menerapkan Ord, sehingga untuk berbicara. Namun ini bukan masalah besar karena tidak ada yang memaksa kita untuk mengimplementasikan a !< b = not (a < b), kita bisa saja mengatakan (! <) = (> =).
Ingo

8

Transact-SQL memiliki !> (Tidak lebih besar dari) dan ! <(Tidak kurang dari) operator.

Jadi, selain Anda, seseorang di Sybase Microsoft juga berpikir itu akan menjadi ide yang bagus. Sama seperti Microsoft Bob! :)


Bukankah ini ditambahkan pada v 2005?
JeffO

5
ada banyak orang gila yang keliru di dunia ini yang tidak sendirian dalam menyetujui satu sama lain, konsensus! = benar.

@ Jeffe Maka kita harus menyalahkan Microsoft, bukan Sybase?
yannis

Menarik. Saya ingin tahu kisah di balik ini.
surfasb

@surfasb Yeap, saya juga. Dugaan saya adalah bahwa itu hanya gula sintaksis, tidak ada yang istimewa tentang itu.
yannis

4

Saya pikir jawabannya sederhana saja bahwa tidak perlu !<operator. Seperti yang Anda tunjukkan dalam pertanyaan Anda, sudah >=dan <=seiring dengan kemungkinan untuk meniadakan ekspresi yang ada, jadi mengapa menambahkan operator lain?


Saya setuju bahwa tidak ada gunanya menambahkan operator yang melakukan hal yang sama, tetapi mengapa "mereka" memilih> = alih-alih! otak untuk mengerti.
Alex Burtsev

!<tidak lebih pendek untuk mengetik daripada >=, atau apakah saya kehilangan sesuatu?
Bryan Oakley

Maksud saya representasi teks (teks diucapkan).
Alex Burtsev

4

Dari RFC 1925

kesempurnaan telah dicapai bukan ketika tidak ada yang tersisa untuk ditambahkan, tetapi ketika tidak ada lagi yang tersisa untuk diambil.

Menambahkan operator tambahan yang menduplikasi fungsi yang ada tidak melakukan apa pun selain menambah kompleksitas (tidak perlu) ke bahasa (dan dengan demikian tokenizer dan parser).

Pertimbangkan juga dalam bahasa-bahasa di mana operator kelebihan mungkin, Anda akan memiliki operator lain untuk kelebihan muatan. Pertimbangkan kebingungan kapan bool operator<=dan bool operator!>bisa mengembalikan hal-hal yang berbeda (ya, saya tahu orang sudah dapat membuat perbandingan yang tidak konsisten).

Terakhir, pikirkan bahasa di mana metode atau operator didefinisikan secara berlipat ganda (Ruby - Saya melihat Anda ) dan Anda memiliki satu programmer yang menggunakan <= sementara yang lain menggunakan!> Dan Anda memiliki beberapa gaya kode untuk ekspresi yang sama.


Iya nih! Ini adalah prinsip dari Parsimony Ilmiah.
luser droog

3

! <sama dengan> = Sekarang mengapa kita memiliki yang kedua bukan yang pertama karena semua bahasa menerapkan operator positif terlebih dahulu dan kemudian mendekati operator negatif, Karena menerapkan> = juga mencakup! <dan <= mencakup!>. Jadi pembuat bahasa beralih ke ini dan berpikir mereka akan berlebihan dan melewatkannya.

Selalu mencoba menerapkan kasus positif terlebih dahulu kemudian pergi ke kasus negatif (:) berpikir positif, saya hanya melihat pribadi)


2

Alasannya adalah bahwa operator dalam bahasa pemrograman meminjam dari tradisi matematika dan dalam matematika tidak seorang pun benar-benar menggunakan "tidak lebih besar" dan "tidak lebih kecil" karena "lebih kecil atau sama" dan "lebih besar atau sama" melakukan pekerjaan yang sama baiknya.

Jadi dalam bahasa Pemrograman kita biasanya mendapatkan simbol yang terlihat seperti ≠ karena tidak sama ( !=atau /=, kecuali jika seseorang suka dengan <>operator teks)

dan hal-hal yang terlihat seperti ≤ dan ≥ ( <=dan >=)


Btw, saya tidak setuju dengan pernyataan Anda bahwa BUKAN lebih mudah untuk dipahami dan alasan tentang itu ATAU. Dalam matematika, bukti yang melibatkan banyak negasi (seperti reduksi menjadi absurd) biasanya disukai jika ada alternatif yang lebih langsung tersedia. Juga, dalam kasus pemesanan, pengetahuan dasar yang kita miliki (dan yang digunakan ketika berpikir atau membuktikan sesuatu) adalah tricotomy antara <, = dan> jadi! <Pernyataan mungkin harus dikonversi ke> = jika Anda ingin melakukan apapun yang berguna dengannya.


2

Saya sebagian menyalahkan set instruksi perakitan. Anda sudah mendapat instruksi seperti jgeuntuk "melompat jika lebih besar atau sama". Berbeda dengan "melompat jika tidak kurang dari".

Penulis kompiler mungkin telah keluar dari apa yang dihasilkan oleh para penulis majelis, yang mungkin didasarkan pada bagaimana labelnya ketika dirancang pada chip.

...mungkin.


1

Saya pikir saya melihat beberapa bahasa beberapa tahun yang lalu di mana, alih-alih !=operator (tidak sama dengan), sesuatu seperti <>digunakan. Tidak dapat mengingat nama mereka, meskipun ...

Saya pikir lebih sulit untuk dibaca !(a < b)atau a !< bdibandingkan a >= b. Mungkin itulah alasan mengapa !<tidak digunakan (memang terlihat jelek menurut saya).


1
<>is (was?) terutama digunakan oleh dialek BASIC, SQL, dan dialek Pascal.
yannis

@Yannis Rizos terima kasih atas pengingatnya. Mereka mengajari kami Pascal di sekolah menengah dan di situlah saya melihatnya :).
Radu Murzea

2
Python 2 juga memiliki <>, meskipun telah dihapus dalam 3
Daniel Lubarov

Dari sudut pandang logis, !=lebih umum daripada <>, karena Anda dapat memiliki hal-hal (seperti bilangan kompleks) di mana kesetaraan didefinisikan dengan baik tetapi sebenarnya tidak ada urutan yang berguna.
David Thornley
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.