是否有“ nor”的关键字或运算符?


56

是否有一个等于nor的运算符?例如,我最喜欢的颜色既不是绿色也不是蓝色。

该代码将等效于:

// example one
if (color!="green" && color!="blue") { 

}

// example two
if (x nor y) {
    // x is false and y is false
}

12
不,因为我们已经有了or!,并且因为很少使用双底片-多数人发现它们特别难以阅读。
凯莉安·佛斯

70
@KilianFoth是正确的。然而,低票应该是针对坏问题,而不是针对我们不喜欢的问题。此外,尽管该问题是完全中立且无争议的(已经有某种外来语言的操作员,也没有),但已经有三票赞成该问题,因为它将基于“观点”。
Christophe

3
有名字吗?是的,也不是。是操作员吗?用什么语言?给定一种语言,您可以在spec / docs中查找它。
jonrsharpe

9
@Troyer您的评论演示了问题:您弄错了逻辑。;)不等同于nor。
jpmc26

3
在具有更多运算符的语言中,这将是(例如,在python中)color not in ['green', 'blue']
Izkata

Answers:


72

尽管主流语言没有专用的NOR和NAND运算符,但一些鲜为人知的语言(例如,某些“打高尔夫球”语言)可以。例如,APL具有用于NOR和NAND,分别。

可以在诸如VHDLVerilog等硬件设计语言中找到另一类示例。NAND和NOR门在硬件设计中非常有用,因为通常比用AND / OR / NOT制成的等效电路便宜(需要更少的晶体管)。门,这是硬件设计语言倾向于包含它们的原因之一;另一个原因是,它们对于某些位摆弄的技巧很有用。


40
APL不是打高尔夫球的语言,而是一种面向阵列的语言,它允许交互式开发具有工业实力的全栈多范例应用程序。
亚当

59
@Adám:Bingo
埃里克·杜米尼尔

6
@EricDuminil :-)不过,这都是真的。
亚当

20
@EricDuminil不,真的。APL不是打高尔夫球的语言,它是一种实用的语言,碰巧擅长打高尔夫球。Perl在这方面是相似的,不是吗?
帕维尔

13
OP实际上并没有说过APL是一种“高尔夫”语言,顺便说一句。
威尔·克劳福德'18

46

不,nor任何高级主流编程语言都没有运算符。

为什么呢

主要是因为很难阅读:

  • 它需要几个运算符(“ 而不是 ”,或者以更文学的风格:进一步否定 ”,“ 每个不正确)的精神组合。
  • not在第一个操作数上隐含了一个隐含含义,但读者之后才明白这一点。
  • 它与人类语言不同,人类语言在第一个操作数上使用显式取反,例如“ x或y ”,“ x或y ”。因此,读者可能会(x nor y)(x and not y)而不是((not x) and (not y))
  • 一些读者or对不适用的表面语义感到困惑

但这在硬件中是如此普遍...

nor是基本的硬件门,可用于制造所有其他逻辑门。因此,我们可以说所有其他逻辑运算符都是组合,并且nor是最简单的基本逻辑运算符。

但是,硬件的真实情况不一定适用于人类。尽管它在硬件级别上很受欢迎,但一些主流CPU甚至NOR在其汇编程序指令集(例如x86)中都没有提供。

备择方案

可读性很重要。有时可以通过其他方式进行改进。

使用现有运营商

例如:

if x not in [1,2]    // use of 'in' or 'not in' operator instead of x!=1 and x!=2

条件排序

if x==1 or x==2 
     action A
else 
     action B  

代替

if x!=1 and x!=2 
    action B
else 
    action A

使用直到循环

某些语言还提供循环指令,允许使用while或来表达条件until,让您选择更“积极”的方式。这些指令是例如 until c do ...红宝石do until c ...VB,或repeat ... until c及其后代。

例如:

Until (x==1 or x==2) do
     ...

等效于:

While (x!=1 and x!=2)
    ...

发挥作用

现在,如果您仍然喜欢nor语法,则可以定义一个函数,但前提是您不希望出现快捷方式:

If ( nor(x,y) )   // attention, x and y will always be evaluated
    ...  

与操作符相比,该函数具有可读性方面的优势,因为读者可以立即理解,该否定适用于所有参数。在某些语言中,您可以定义具有可变数量的参数的函数。


5
有趣的是,我通常会这样写,因为while (not (x == 1 or x == 2))我发现该x != 1 and x != 2版本难以阅读,并且发现“ x既不是1,也不是2”比“ x不是1且x不是2”要容易得多。
梅尔

1
@Baldrickk您能详细说明吗?
HopefulHelpful

4
@HopefullyHelpful Repeat... Until总是至少执行一次循环体。如果x为1,则循环主体仍将执行,但不会重复。While在这种情况下,循环将不会执行主体。
新浪

2
@Baldrickk是的,您完全正确。当我写等价物时,我只是在谈论循环条件,因为布尔运算符是问题的主题。谢谢,我将改写一下以澄清
Christophe

3
nor(x,y)是否始终评估x和y in 取决于语言和nor()实现方式。在某些语言(D,Io等)中,被调用函数可以决定是否以及何时评估参数。
BlackJack

18

@KilianFoth对这个问题的评论是当场的。

您可以nornot和进行合成or

if (x nor y)

与...完全相同

if (not (x or y))

引入nor作为一个独立的运营商将引入冗余的语言,这是既不需要,也不希望(或-它不需要和不想要的)。

同样,我不知道任何语言都有nand运算符-可能是因为它可以由notand and运算符合成。

从理论上讲,您可以创建仅包含nand或仅包含nor运算符的语言。所有的andor以及not然后可以通过从他们synthesied。唯一的问题是,这将非常荒谬。有关示例,请参见Wikipedia上的NOR逻辑NAND逻辑


4
也可能不需要或不需要冗余:)
Dave

@Dave那个双关语是故意的,很高兴看到您注意到了;-)
Mael

5
单单冗余并不能真正解释为什么nor不包括在内。否则,语言为何具有andor?多亏了德摩根,他们是多余的。事实上,你可以代替所有三个常规逻辑运算符(andornot通过提供)只是 nor,当你正确地指出。
康拉德·鲁道夫'18

1
@KonradRudolph从技术上讲,您只需要一个lambda运算符。我们做更多事情的原因是要匹配大多数程序员的思维模型。大多数程序员用andornot- 来考虑逻辑,因为这是大多数人类语言所使用的。一旦您匹配了and / or / not的心理模型,nor&nand就变得多余了。它们的冗余甚至以其名称编码:“ n(ot)和”和“ n(ot)或”。如果我们有针对他们的独特,预先存在的英语术语,而不仅仅是综合术语,那么您可能会更经常地看到它们。
RM

1
再冗余作为参数:有比更多的语言notandor。例如,某些BASIC方言(GW-BASIC,QuickBASIC等)具有“异或”,“含意” IMP(→NOT(x XOR y))和等价EQV(→NOT(x)OR y)作为附加运算符。
BlackJack

11

是的,APL及其某些方言没有(和nand)。在APL,也没有被表示(因为并且~):

 resultExampleOne color
  :If (color'green')⍱(color'blue')
      result'warm'
  :Else
      result'cold'
  :EndIf


 resultExampleTwo(x y)
  :If xy
      result'x is false and y is false'
  :Else
      result'at least one of them is true'
  :EndIf

在线尝试!


10

这个答案来自1960年代中期生产的计算机的汇编语言。这很模糊,但是在某些方面它解决了您的问题。

DEC(数字设备公司)在1960年代中期推出了PDP-6计算机。该机器总共有64条指令,它们是对两个操作数的布尔运算(包括一些退化的情况)。这64条指令实际上是16个运算符,每个运算符有4个变体。

其中两个运算符ANDCB和ORCB分别实现了NOR和NAND(除非我对双负逻辑感到困惑)。您可以看到 操作码表。该操作码表实际上是PDP-10计算机的后继产品,它是PDP-6的后继产品。

如果您以二进制形式看数字指令,它将变得更加有趣。事实证明,对于范围为400-477(八进制)的所有操作码,指令本身的四位为16个可能的布尔运算符提供了四位真值表。其中一些运算符会忽略其中一个或两个输入。例如,SETZ和SETO忽略两个输入。

PDP-6的设计者利用这一事实来实现所有这些指令,而逻辑所需要的逻辑要少于仅实现其中一些指令所需要的逻辑。其中一些指令很少(如果有的话)出现在汇编语言代码中。但是他们都在那里。

因此ANDCB相当于NOR。(再次,除非我的逻辑倒退,在这种情况下,ORCB是等效的)。


3

Perl的unless关键字可让您反转条件:

unless ($color eq 'green' or $color eq 'blue') {
    # code
}

虽然不是NOR运算符,但是您可以用类似的方式表达您的意图。


3

nor您所描述的运算符将不可重复,这势必会导致许多难以发现的错误。

您的“示例2”实质上是这样的:

if (false nor false) {
becomes
if (true) {

但是,请使用三个变量再试一次,看看会发生什么:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.