Çoğu programlama dilinin '!>' (Daha büyük değil) ve '! <' (En az değil) operatörlerinin olmamasının herhangi bir nedeni var mı?


28

Herhangi bir sebep olup olmadığını merak ediyorum - ya da sadece bir tarih kazasıysa - çoğu programlama dilinde hiç kimse !>ve !<operatör yok mu?

a >= b (daha büyük VEYA b eşittir) olarak yazılmış olabilir !(a < b) (bir DEĞİLDİR az b) , yani eşittir a !< b.

Bu soru bana kendi ifade ağacı kurucumu kodlamanın ortasındayken çarptı. Çoğu programlama dilinin a != boperatörü var !(a=b), öyleyse neden hayır !>ve !<?

GÜNCELLEŞTİRME:

  • !<(daha az değil) telaffuz etmekten daha kolay>= (daha büyük veya eşittir)
  • !<(daha az değil) tipinden daha kısadır>= (daha büyük veya eşittir)
  • !<(değil az) 'dir * anlamak daha kolay daha >=(büyük veya eşittir)

* çünkü ORikili operatör beynin iki operand kullanması gerekir (rende, eşittir), NOTunary operatör iken beynin sadece bir operandla (daha küçük) çalışması gerekir.


3
O var değil her dilde telaffuz mutlaka daha kolay. Mesela Almanca'da "größer / gleich" diyoruz, "nicht kleiner" lafını hiç duymadım.
Ingo,

1
Kolay anlaşılması argüman ya su tutmaz. Her iki durumda da 2 operand kullanmalısınız, çünkü ilişkisel operatörler için bu normaldir. Dahası, sadece beynin 2 yerine 1 operandda daha kolay çalışabileceğini varsayıyorsunuz. Bunun için sinirbilim alanından herhangi bir kanıtınız var mı?
Ingo,

Yanıtlar:


84

D programlama dili ve DMC'nin uzatma C ve C ++ için bu operatörlere (hepsi 14 kombinasyonların) desteklemek, ama ilginçtir, D bu operatörleri kaldırmayı gidiyor başlıca nedeni,

  1. tam olarak nedir a !< b? Öyle a>=b || isNaN(a) || isNaN(b). !<olduğu değil aynı >=çünkü NaN !< NaNgerçek varken NaN >= NaNyanlıştır. IEEE 754'ün ustalaşması zordur , bu yüzden a !< bkullanımı sadece NaN kullanımıyla ilgili karışıklığa neden olacaktır - Phobos'da (D'nin standart kütüphanesi) bu tür operatörleri arayabilirsiniz ve NaN'ın okuyucuna katıldığı okuyucuları hatırlatmak için bir çok kullanımın yanında yorum bulunmaktadır.
  2. bu nedenle, bu tür operatörler D'deki gibi olsa bile, birkaç kişi onu kullanacak,
  3. ve bu nadiren kullanılan operatörler için derleyiciyi çok az fayda sağlayacak şekilde karmaşıklaştıran 8 belirteç daha tanımlamak zorundadır.
  4. ve bu operatörler olmadan kişi yine de eşdeğerini kullanabilir !(a < b)veya biri açık olmayı seviyorsa a >= b || isNaN(a) || isNaN(b)ve okunması daha kolaydır.

Ayrıca, ilişkiler (≮, ≯, ≰, ≱), !=(≠) veya >=(≥) aksine, temel matematikte nadiren görülür , bu yüzden birçok insan için anlaşılması zordur .

Bunlar muhtemelen çoğu dilin onları desteklememesinin sebepleridir.


seldomly seen in basic math- daha çok, hiç görülmemiş gibi. Cebirde tekrar matematiksel olarak eşdeğerine çevirmeyi öğreniyoruz (özellikle NaNtemel matematikte görünmüyor)
Izkata

Gerçekten IMHO ihtiyaç duyulan hangi uslu olarak değişkenleri bildirerek bir araçtır bir double haricinde kendi için NaNdavranışları. Çoğu durumda, herhangi bir karşılaştırma yapabilecek kod her şeyden daha büyük bir karşılaştırma yapmak NaN, NaNher şeyden daha küçük bir karşılaştırma yapmak ister veya karşılaştırma girişimi için bir istisna atmak ister. Kodun bildirimsel olarak nasıl NaNdeğerlendirileceğini belirtmesine izin vermek , doğru davranışa ulaşmak için zorunlu kodu kullanma gereksinimini azaltır.
supercat,

@supercat: <fenv.h>gibi işlevleri kullanarak istisna atmak için NaN işlemleri yapabilirsiniz fesetexceptflag.
kennytm

@KennyTM: Bir işlem yapmadan önce bayrağını ayarlamak ve daha sonra tekrar ayarlamaktan kaçınmak çok tehlikeli ve sorunlu görünüyor ve toplam bir emir vermek isteme ihtimalini ele almıyor. Anladığım kadarıyla IEEE, vadesi geçmiş bir değişiklik olursa hoş geldin olarak kabul edeceğim toplam bir emir getirecek bazı yeni karşılaştırma yöntemleri getirmiştir; Dillerin nasıl tepki verdiğini görmek ilginç olacak.
supercat

47

Çünkü aynı anlamı taşıyan iki farklı operatöre sahip olmak pek mantıklı değil.

  • “Daha büyük değil” ( !>) “daha ​​az ya da eşit” ile aynıdır ( <=)
  • “Daha az değil” ( !<) “büyük ya da eşit” ( >=) ile tamamen aynıdır.

Bu “eşit değil” ( !=) için geçerli değildir , aynı anlama sahip bir operatör yoktur.

Bu yüzden, modifikasyonunuz dili hiçbir faydası olmadan daha karmaşık hale getirecek.


5
Peki ya x = x + 1, x += 1ve x++?

33
@dunsmoreb: Bunların hiçbiri aynı şey değil. Sadece bir tanesi "artış" amacına hizmet eder. Aynı amaca hizmet etmek için diğer iki ifadeden yararlandığınız gerçeği alakasızdır - ikisi de daha geneldir.
DeadMG

1
<>!=Python 2'nin her ikisi de aynı anlama sahip bir operatördür .
krlmlr

9
@ user946850 Ve her ikisi artık yaygın bir hata olarak kabul edilir sahip, kullanımı <>uzun süredir kullanımdan kaldırıldı ve bunun 3.0 beri kaldırılır (ve sakıncası, son 2.x sürüm hiç , 2.7, 2010 yazında serbest bırakıldı).

3
@svick ++ operatörünü daha da parlak yapan, bu C # programcılarının buraya gelmesini önler, program davranışı hakkında rasyonel varsayımlar yapar, sonra C ++ programcı işimi çalar!

10

!<ile eşanlamlıdır >=. Daha sonra sadece iyi tanımlanmış bir matematik sembolünü yazmanın bir yoludur . Konuşulan dilde "az olmamakla birlikte " haklısın , ancak konuşmacı ve belirsiz olabiliyor (olarak yorumlanabilir veya yanlış yorumlanabilir >). Öte yandan, programlama ve matematik açıkça tanımlanmış, açık olmayan bir terminoloji kullanır.

Hatta örneğin ANSI SQL gibi 3 değerli mantık, içinde, not x < yeşdeğer x >= yoldukları gibi hem vermek, NULLeğer ikisinden biri xya da ybir NULL. Bununla birlikte, ANSI uyumlu olmayan SQL lehçeleri vardır, burada eşdeğer değildir ve ellerinde vardır!< .


10
Ancak, kayan nokta sayıları kullanılırken genellikle eşdeğer değildirler. Örneğin, herhangi bir şey karşılaştıran NaNsahte, böyledir !(2 < NaN) == true, süre (2 >= NaN) == false.
Hammar

@ Hammar: Doğru, ancak NaNs etrafındaki tüm aritmetik ilişkiler için de geçerlidir . Hepsi normal davranmayı bıraktı.
Nicol Bolas,

@hammar - bu kayan nokta hatası, tabiri caizse Ord'u tam olarak uygulamak değil. Yine de kimse bizi uygulamaya zorlamadığı için bu büyük bir problem değil a !< b = not (a < b), sadece şunu söyleyebiliriz (! <) = (> =).
Ingo,

8

Transact-SQL, !> (Büyük değil) ve ! <(Küçük değil) operatörlerine sahiptir.

Bu yüzden, sizden başka, Sybase Microsoft'taki bir kişi de bunun iyi bir fikir olacağını düşündü. Tıpkı Microsoft Bob gibi! :)


Bu v 2005’te eklenmedi mi?
JeffO 16

5
Bu dünyada birbirleriyle hemfikir olmaları için yalnız olmayan çılgınca, kötü tavsiye edilen insanlar var, fikir birliği! = doğruluk.

@JeffO O zaman Sybase'i değil, Microsoft'u suçlamalıyız?
yannis

İlginç. Bunun arkasındaki hikayeyi merak ediyorum.
surfasb

@surfasb Yeap, ben de. Tahminime göre bu sadece sözdizimsel şeker, özel bir şey değil.
yannis

4

Bence cevap basitçe bir !<operatöre gerek yok . Sorunuzda belirttiğiniz gibi, mevcut bir ifadeyi reddetme olasılığı zaten var >=ve <=neden başka bir operatör eklesin?


Aynı şeyi yapan operatör eklemenin bir anlamı olmadığını kabul ediyorum, ancak neden "onlar" seçtiler> = yerine <=! beyin anlamak için.
Alex Burtsev

!<yazmaktan daha kısa değil mi >=, yoksa bir şey mi eksik?
Bryan Oakley

Bunun anlamı metin temsili (telaffuz edilmiş metin).
Alex Burtsev

4

RFC 1925'ten itibaren

mükemmelliğe, eklenecek bir şey kalmadığında değil, alınacak bir şey kalmadığında ulaşıldı.

Var olan işlevselliği çoğaltan ek operatörler eklemek, diline (gereksiz) karmaşıklık eklemekten başka bir şey yapmaz (ve böylece belirteç ve ayrıştırıcı).

Operatör aşırı yüklenmesinin mümkün olduğu dillerde de düşünün, aşırı yüklenecek başka bir operatörünüz daha olacaktı. Farklı şeylerin ne zaman bool operator<=ve ne zaman ortaya bool operator!>çıkabileceği konusundaki karışıklığı düşünün (evet, birinin zaten karşılaştırmalı karşılaştırmalar yapabileceğini biliyorum).

Son olarak, yöntemler veya operatörler çarpın tanımlanan dillerin düşünüyorum (Yakut - Ben bakıyorum senin ) ile bir programcı kim kullanımları vardır <= Başka kullanır iken!> Ve aynı ifadesi için birden fazla kod stilleri var.


Evet! Bilimsel Parsimony ilkesidir.
kullanıcı

3

. ve gereksiz olduğunu düşündüm ve onları atlamak.

Daima önce pozitif durumu uygulamaya çalışın, sonra negatif duruma gidin (:) pozitif düşünme, sadece kişisel görüşüm)


2

Bunun nedeni, programlama dillerindeki operatörlerin matematik geleneğinden ödünç aldıkları ve matematikteki hiç kimsenin, "küçük veya eşit" ve "büyük veya eşit" olmalarının, bir iş kadar iyi olmaları nedeniyle "büyük değil" ve "küçük değil" kullanmalarıdır.

Yani dilleri Programlama biz genellikle (eşittir değil ≠ sembolü gibi bakıyor olsun !=ya /=, sürece birileri ile fantezi olmaktan eğer <>veya metinsel operatör)

ve ≤ ve ≥ ( <=ve >=) gibi görünen şeyler


BTW, OR'dan daha kolay anlaşılması ve sebep olmadığını iddia ettiğine katılıyorum. Matematikte, eğer daha doğrudan bir alternatif varsa, çok fazla olumsuzlama içeren deliller (saçma azalması gibi) genellikle kaşlarını çattı. Ayrıca, sipariş durumunda, sahip olduğumuz (ve bir şeyi düşünürken ya da kanıtlarken kullanılan) temel bilgi, <, = ve> arasındaki traktomidir, yani herhangi bir! onunla faydalı bir şey.


2

Montaj talimat setini kısmen suçluyordum. jge"Eğer büyük veya eşit ise zıpla" gibi talimatlara sahipsiniz . "En az değilse atla" nın aksine.

Derleyici yazarlar, hangi çipte tasarlanırken nasıl etiketlendiğine dayanarak hangi montaj yazarlarının ortaya çıktığından kurtulmuş olabilir.

... Olabilir.


1

Sanırım birkaç yıl önce, !=operatör yerine (eşit değil), bunun gibi bir <>şeyin kullanıldığı bazı dilleri gördüm . İsimlerini hatırlayamıyorum ama ...

Ben okumak zor olduğunu düşünüyorum !(a < b)ya a !< bdaha a >= b. Muhtemelen !<kullanılmamasının nedeni budur (bence çirkin görünüyor).


1
<>(?) temel olarak BASIC lehçeleri, SQL ve Pascal lehçeleri tarafından kullanılır.
yannis

@Yannis Rizos hatırlatma için teşekkürler. Bize Pascal’ı lisede öğrettiler ve orayı gördüm :).
Radu Murzea,

2
Python 2 ayrıca <>3'te çıkarılmış olmasına rağmen var.
Daniel Lubarov

Mantıksal bir bakış açısıyla, eşitliğin iyi tanımlandığı fakat gerçekten yararlı bir düzen bulunmadığı şeylere (karmaşık sayılar gibi) sahip olabileceğinizden !=daha geneldir <>.
David Thornley,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.