C中的运算符优先级(!=和|)

时间:2016-06-07 14:27:20

标签: c operator-precedence

我最近更正了C程序中的一个错误:

if (foobar != FOO | BAR | BAZ)

正确的代码是

if (foobar != (FOO | BAR | BAZ))

根据C operator precedence,显然!=优先于|

我的问题是为什么它是这样而不是相反?根据我的经验,我经常使用a == b || a == cd == (a | b | c),但绝不使用a == b | c == d

这种选择背后的逻辑是什么?

2 个答案:

答案 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这样的东西。优先规则是基于此而设计的。

后来,短期运营商被添加,但旧运营商的优先权没有修改。