Existe-t-il un équivalent opérateur de ni ? Par exemple, ma couleur préférée n'est ni le vert ni le bleu.
Et le code serait équivalent à:
// example one
if (color!="green" && color!="blue") {
}
// example two
if (x nor y) {
// x is false and y is false
}
or
et!
, et parce que les doubles négations sont rarement utilisées - la plupart des gens les trouvent particulièrement difficiles à lire.color not in ['green', 'blue']
Réponses:
Bien que les langues grand public ne disposent pas d'opérateurs NOR et NAND dédiés, certaines langues moins connues (par exemple, certaines langues de "golfing") en ont une. Par exemple, APL a
⍱
et⍲
pour NOR et NAND, respectivement.Une autre classe d'exemples peut être trouvée dans les langages de conception matérielle tels que VHDL , Verilog , etc. Les portes NAND et NOR sont très utiles dans la conception matérielle car elles sont généralement moins chères (nécessitant moins de transistors) que le circuit équivalent constitué de ET / OU / NON les portes, ce qui est l’une des raisons pour lesquelles les langages de conception de matériel ont tendance à les inclure; une autre raison est qu'ils peuvent être utiles pour certaines astuces de bidouillage.
la source
Non, il n'y a pas d'
nor
opérateur dans un langage de programmation grand public de haut niveau.Pourquoi ?
Principalement parce qu'il est difficile à lire:
not
sur le premier opérande, mais le lecteur ne le comprendra que plus tard(x nor y)
avec(x and not y)
au lieu de((not x) and (not y))
or
sémantique apparente qui ne s'applique pasMais c'est tellement courant dans le matériel ...
nor
est une porte matérielle élémentaire qui peut être utilisée pour créer toutes les autres portes logiques. On pourrait donc soutenir que tous les autres opérateurs logiques sont des combinaisons et qu’ilnor
s’agit de l’opérateur logique élémentaire le plus simple.Cependant, ce qui est vrai pour le matériel n'est pas nécessairement vrai pour les humains. Et malgré sa popularité au niveau matériel, certains processeurs traditionnels n’offrent même pas d’
NOR
instructions d’assemblage (par exemple x86 ).Des alternatives
La lisibilité est importante. Et parfois, cela peut être amélioré par d'autres moyens.
Utilisation des opérateurs existants
Par exemple:
Commande de conditions
au lieu de
Utilisation de jusqu'à boucle
Certaines langues offrent également des instructions en boucle qui permettent d’exprimer des conditions avec
while
ou avecuntil
, vous permettant de choisir la méthode la plus "positive". Ces instructions sont par exempleuntil c do ...
en ruby ,do until c ...
en vb ourepeat ... until c
en pascal et ses descendants.Par exemple:
est équivalent à:
Faire une fonction
Maintenant, si vous préférez toujours la
nor
syntaxe, vous pouvez définir une fonction, mais uniquement si vous ne vous attendez pas à ce qu'un raccourci se produise:Il y a un avantage de lisibilité de la fonction sur l'opérateur, car le lecteur comprend immédiatement que la négation s'applique à tous les arguments. Dans certaines langues, vous pouvez définir une fonction avec un nombre variable d'arguments.
la source
while (not (x == 1 or x == 2))
je trouve lax != 1 and x != 2
version difficile à lire et que «x n’est ni 1 ni 2» est beaucoup plus facile à traiter que «x n’est pas 1 et x n’est pas 2».Repeat
...Until
exécute toujours le corps de la boucle au moins une fois. Si x vaut 1, le corps de la boucle est toujours exécuté, mais pas répété. LaWhile
boucle n'exécutera pas le corps dans ce cas.nor(x,y)
soient toujours évalués dépend de la langue et de lanor()
mise en œuvre. Il existe des langages (D, Io,…) où la fonction appelée peut décider si et quand évaluer des arguments.Le commentaire de @ KilianFoth sur la question est sur place.
Vous pouvez synthétiser à
nor
partir denot
etor
:est exactement le même que
L'introduction en
nor
tant qu'opérateur distinct introduirait des redondances dans la langue, qui ne sont ni nécessaires, ni souhaitées (ou - qui ne sont ni nécessaires ni souhaitables).De même, je ne connais pas de langue ayant un
nand
opérateur - probablement parce qu'il peut être synthétisé à partir denot
et d'and
opérateurs.Vous pouvez, en théorie, créer une langue avec des opérateurs uniquement
nand
ou uniquementnor
. Tousand
,or
etnot
pourrait alors par synthesied d'eux. Le seul problème est que cela serait ridiculement lourd. Pour des exemples, voir la logique NOR et la logique NAND sur Wikipedia.la source
nor
n'est pas inclus. Sinon, pourquoi les langues ontand
etor
? Ils sont redondants, grâce à De Morgan. En fait, vous pouvez remplacer les trois opérateurs logiques classiques (and
,or
,not
) en fournissant simplementnor
, comme vous l' avez justement observé.and
,or
etnot
- parce que ce utilisent les langues humaines. Une fois que vous correspondez au modèle mental de et / ou / non, alors, ni devenir ni redondant. Leur redondance est même encodée dans leurs noms: "n (ot) et" et "n (ot) ou". Si nous avions pour eux des termes anglais distincts et préexistants, et pas seulement des termes synthétisés, vous les verrez probablement plus souvent.not
,and
,or
. Par exemple, certains dialectes BASIC (GW-BASIC, QuickBASIC,…) ont des opérateurs exclusifs ou XOR, IMP (→ NOT (x XOR y)) et une équivalence EQV (→ NOT (x) OU y).Oui, APL et certains de ses dialectes ont ni (et nand ). Dans APL, ni est notée
⍱
(depuis∨
est ou et~
n'est pas ):Essayez-le en ligne!
la source
Cette réponse provient du langage assembleur pour un ordinateur fabriqué au milieu des années 1960. C'est assez obscur, mais à certains égards, cela répond à votre question.
DEC (Digital Equipment Corporation) a lancé l'ordinateur PDP-6 au milieu des années 1960. Cette machine avait un total de 64 instructions qui étaient des opérations booléennes sur deux opérandes (y compris des cas dégénérés). Ces 64 instructions étaient en réalité 16 opérateurs avec 4 variantes dans chaque opérateur.
Deux des opérateurs, ANDCB et ORCB, ont respectivement implémenté NOR et NAND (à moins que je ne sois mêlé à la logique du double négatif). Vous pouvez voir la table d'opcode . La table d'opcode est en réalité pour l'ordinateur PDP-10, un successeur du PDP-6.
Si vous regardez l'instruction numérique en binaire, cela devient plus intéressant. Il s'avère que pour tous les opcodes compris entre 400 et 477 (octal), quatre bits de l'instruction elle-même fournissent une table de vérité de quatre bits à 16 opérateurs booléens possibles. Certains de ces opérateurs ignorent une ou les deux entrées. Par exemple, SETZ et SETO ignorent les deux entrées.
Les concepteurs du PDP-6 ont exploité ce fait pour implémenter toutes ces instructions avec moins de logique qu'il n'en aurait fallu pour en implémenter seulement certaines. Certaines de ces instructions apparaissent rarement, voire jamais, dans le code en langage assembleur. Mais ils étaient tous là.
Ainsi, ANDCB est l'équivalent de NOR. (encore une fois, à moins que ma logique ne soit inversée, auquel cas ORCB est l'équivalent).
la source
Perl a le
unless
mot clé qui vous permet d'inverser les conditions:Bien que vous ne soyez pas un opérateur NOR, vous pouvez exprimer votre intention de la même manière.
la source
L'
nor
opérateur, comme vous l'avez décrit, ne serait pas reproductible, ce qui entraînera de nombreuses bogues difficiles à détecter.Votre "exemple 2" est essentiellement ceci:
Mais essayez à nouveau avec trois variables et voyez ce qui se passe:
la source