有人使用命名的布尔运算符吗?

时间:2009-07-09 11:36:47

标签: c++ boolean

或者我们都坚持我们的教学“&&,||,!”方式是什么?

为什么我们应该使用其中一个呢?

我只是想知道,因为有几个答案说明代码应该尽可能自然,但是我没有看到很多带有“and,or,not”的代码,而这更自然。

13 个答案:

答案 0 :(得分:19)

我喜欢not运算符的概念,因为它比!运算符更明显。例如:

if (!foo.bar()) { ... }

if (not foo.bar()) { ... }

我建议第二个更明显和可读。我认为同样的论点不一定适用于andor表格。

答案 1 :(得分:9)

“名字中有什么?我们称之为&&amp ;, ||或! 任何其他名称都会闻起来很甜蜜。“

换句话说,自然取决于你习惯的东西。

答案 2 :(得分:7)

过去不支持这些。即使是现在,您仍需要对某些编译器进行特殊切换以启用这些关键字。这可能是因为旧的代码库可能有一些函数||名为“and”“或”“not”的变量。

答案 3 :(得分:7)

使用它们的一个问题(无论如何)是在MSVC中你必须包含iso646.h或使用(主要是不可用的)/ Za开关。

我遇到的主要问题是Catch-22,它们并不常用,所以它们需要我的大脑积极处理意义,老式的操作员或多或少根深蒂固(有点像阅读学习语言与母语之间的区别。

虽然我确信如果他们的使用变得更加普遍,我会克服这个问题。如果发生这种情况,那么我就会遇到一些布尔运算符有关键字但其他布尔运算符没有关键字的问题,所以如果使用了替代关键字,你可能会看到如下表达式:

if ((x not_eq y) and (y == z) or (z <= something)) {...}

在我看来,他们应该为所有(至少比较)运营商提供替代令牌:

if ((x not_eq y) and (y eq z) or (z lt_eq something)) {...}

这是因为提供备用关键字(以及有向图和三字母)的原因并不是为了使表达式更具可读性 - 这是因为历史上某些地方存在(可能仍然是)键盘和/或代码页,没有一些标点字符。例如,ISO 646代码页(惊喜)的不变部分缺少“|”,“^”和“~”等字符。

答案 4 :(得分:5)

虽然我从很长一段时间以来一直在编写C ++,但我不知道关键词“and”“或”和“not”是允许的,我从未见过它。

我搜索了我的C ++书籍,我发现了一小部分提到了普通算子“&amp;&amp;”,“||”的替代表示。和“!”,它解释了那些没有“&amp;!|”的非标准键盘的用户符号。

有点像C中的三字母。

基本上,我会对它们的使用感到困惑,我想我不会是唯一的。 使用非标准的表示,应该有充分的理由使用。 如果使用它,它应该在代码中一致地使用,并在编码标准中描述。

答案 5 :(得分:3)

有向图和三字符运算符实际上是为没有标准ASCII字符集的系统设计的 - 例如IBM大型机(使用EBCDIC)。在机械打印机的旧时代,有一种称为“48字符打印链”的东西,顾名思义,它只带有48个字符。 A-Z(大写),0-9和一些符号。由于其中一个缺失的符号是下划线(呈现为空格),这可能使得像C和PL / 1这样的语言成为一种真正有趣的活动(这是2个单词还是带有下划线的单词???)。 / p>

传统的C / C ++用符号编码,而不是有向图。虽然我已经知道#define“NOT”,但是因为它使布尔表达式的含义更加明显,并且在视觉上比一个瘦小的“!”更难以错过。

答案 6 :(得分:3)

我希望我可以使用||和&amp;&amp;在正常的演讲中。当我说“和”或“或”......

时,人们会非常努力地误解

答案 7 :(得分:2)

我个人喜欢运营商看起来像运营商。这是所有的数学,除非你开始使用“添加”和“减去”运算符,它开始看起来有点不一致。

我认为有些语言适合单词式,有些适合符号,只因为它是人们习惯的而且有效。如果没有损坏,请不要修理它。

还有优先权的问题,这似乎是引入新运营商的原因之一,但谁可能不愿意学习更多规则而不是他们需要?

答案 8 :(得分:2)

如果我使用直接映射到现实世界的名称编程,我倾向于使用'和'和'或',例如:

if(isMale or isBoy and age < 40){}

答案 9 :(得分:2)

在Eclipse + gcc中使用'em是很好的,因为它们被突出显示。但是,代码不能用一些编译器编译: - (

答案 10 :(得分:2)

使用这些运算符是有害的。请注意,andor是逻辑运算符,而外观相似的xor是按位运算符。因此,将andor的参数标准化为01,而将xor的参数标准化。

想象一下

    char *p, *q; // Set somehow
    if(p and q) { ... } // Both non-NULL
    if(p or q) { ... } // At least one non-NULL
    if(p xor q) { ... } // Exactly one non-NULL

Bzzzt,您有一个错误。在最后一种情况下,您要测试指针中的至少一位是否不同,这可能与您认为的不一样,因为那样的话您会写成p != q

这个例子不是假设的。我曾经和一个学生一起工作,他喜欢这些识字的操作员。由于无法解释的原因,他的代码有时会失败。当他问我时,我可以解决这个问题,因为我知道C ++没有逻辑xor运算符,而且那行令我感到非常奇怪。

顺便说一句,用C ++编写逻辑异或的方法是

!a != !b

答案 11 :(得分:1)

我喜欢这个主意,但不要使用它们。我已经习惯了以前的方式,这对我来说没有任何好处。同样适用于我们小组的其他成员,但是,我确实担心我们可能希望转而帮助避免未来的程序员绊倒旧符号。

答案 12 :(得分:1)

总结一下:由于以下组合,它没有被大量使用

  • 未使用的旧代码
  • 习惯(更标准)
  • 品味(更像数学)

感谢您的想法