我最近更正了C程序中的一个错误:
if (foobar != FOO | BAR | BAZ)
正确的代码是
if (foobar != (FOO | BAR | BAZ))
根据C operator precedence,显然!=
优先于|
。
我的问题是为什么它是这样而不是相反?根据我的经验,我经常使用a == b || a == c
或d == (a | b | c)
,但绝不使用a == b | c == d
。
这种选择背后的逻辑是什么?
答案 0 :(得分:4)
历史原因,丹尼斯·里奇引用:
“早期C没有单独的运营商和&和&&或者和||。代替 它使用了'真值 - 值的概念(继承自B和BCPL) context':在'if'和'while'之后的预期布尔值的位置 等等;和&和|运营商被解释为&&和||是 现在;在普通表达式中,使用了逐位解释。 它运作得很好,但很难解释。 (有 “真实价值背景下的'顶级经营者'的概念。” 优先权&和|就像他们现在一样。
主要是在敦促 艾伦斯奈德,&&和||运营商增加了。这成功了 分离了逐位运算和短路的概念 布尔评估。但是,我对优先权感到冷淡 问题。例如,有很多程序包含以下内容: if(a == b& c == d)...
“回想起来,最好还是去 提前并改变&的优先顺序高于==,但似乎 分裂和安全更安全和&&没有移动&过去现有的 运算符“。
答案 1 :(得分:0)
Dennis Ritchie的Development of the C Language报道了这个和其他好奇的历史文物。
基本上,该语言最初没有&&
和||
运算符 - 只有&
和|
,所以将写像a == b | c == d
这样的东西。优先规则是基于此而设计的。
后来,短期运营商被添加,但旧运营商的优先权没有修改。