如果它是从BASIC继承的一些遗迹,那么它是否代表了1964年(BASIC)与C(1972)等后期语言时代的思维变化?
这只是猜测,但为了更简单的实现和零/非零逻辑的灵活性,可能选择逐位的AND / OR / NOT(在8位BASIC实现的时代).你不能让语言变得太复杂,因为这回到了“家庭计算机”时代,当时CPU周期以千赫兹为单位,内存以千字节为单位,存储设备则罕见或昂贵或具有主要性(如纸带读取器或匆忙改编的录音机/播放器).
Dartmouth BASIC(这一切的开头,c 1964,http://bitsavers.trailing-edge.com/pdf/dartmouth/BASIC_4th_Edition_Jan68.pdf),甚至没有AND / OR / NOT,甚至不是IF的关键词.
然而,就微软的BASIC而言,Altair BASIC(c 1975,1https://en.wikipedia.org/wiki/Altair_BASIC)的开头就是这样. Altair BASIC有AND / OR / NOT(https://ia601600.us.archive.org/35/items/bitsavers_mitsMITSAl_6669937/MITS_AltairBASIC_1975.pdf),描述为“LOGICAL AND BITWISE”(第27页 – 第31页,PDF格式).与Altair BASIC一样,False / True映射到0 / -1;并且对于IF的任何非零表达式执行THEN子句.这显然是后来版本的惯用语.
(旁注,我不知道他们的“INTRUDER ALERT”示例是否真的有效,但对我来说似乎不对.)
无论如何,因为AND / OR / NOT是处理整数的运算符,所以将它们添加到表达式解析器/赋值器代码中是很简单的工作.考虑到当时的单位数字千字节内存容量,添加额外的零vs非零运算符可能是一个昂贵的想法.短路AND / OR / NOT将涉及跳转,使表达式解析器/评估器成为更复杂的设计.
由于NOT 0为-1(所有位都设置为1,并以二进制补码的方式进行解释),因此本身需要-1作为True的标准(因此“LOGICAL”方面将按预期工作).
你会注意到VB.NET只是保留了那个遗留的习惯用法(就像它取代的VB6一样),但是每当你把它转换成Integer时它只是一个问题.但正如Hans Passant指出的那样,VB.NET已经从那里发展而来.