Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 运算符优先级(按位';';低于';==';)_C_Bitwise Operators_Operator Precedence - Fatal编程技术网

C 运算符优先级(按位';';低于';==';)

C 运算符优先级(按位';';低于';==';),c,bitwise-operators,operator-precedence,C,Bitwise Operators,Operator Precedence,在C编程语言中,为什么位运算符(&和|)的优先级低于相等运算符(=)?这对我来说毫无意义。我没有权威的答案来解释为什么K&R选择了他们的优先顺序。一个相当有意义的例子是: if (x == 1 & y == 0) { /* ... */ } 因为这是按位AND运算符,所以它使用非短路计算模式,就像 if (x == 1 | y == 0) { /* ... */ } 使用非短路或断路操作器。这可能就是为什么他们选择这样的优先组,但我同意你的看法,回顾过去,这似乎不是一

在C编程语言中,为什么位运算符(&和|)的优先级低于相等运算符(=)?这对我来说毫无意义。

我没有权威的答案来解释为什么K&R选择了他们的优先顺序。一个相当有意义的例子是:

if (x == 1 & y == 0) {
    /* ... */
}
因为这是按位AND运算符,所以它使用非短路计算模式,就像

if (x == 1 | y == 0) {
    /* ... */
}

使用非短路或断路操作器。这可能就是为什么他们选择这样的优先组,但我同意你的看法,回顾过去,这似乎不是一个好主意。

你需要问问布赖恩·克尼汉或丹尼斯·里奇。
本论坛:

&&和| |运算符是后来添加的 因为他们的“短路”行为。丹尼斯·里奇承认 retrospect注意到按位运算符的优先级应具有 添加逻辑运算符时已更改。但是有几个 当时存在100千字节的C源代码 安装了三台电脑后,丹尼斯觉得太大了 C语言的一个变化


那么,这可能是一个原因?我猜测,由于存在几层位顺差(与关系比较不同),它是自…永远…以来就存在的,只是从未被纠正过的残缺。

回想起来,这对丹尼斯·里奇来说也没有意义


&&和| |在|和&之后添加到语言中,并且出于兼容性的原因保留了优先级。

因为这是他们设计它的方式。另外,括号也很便宜。为什么对你来说没有意义?我在使用表达式if(a&b==c)时被发现了,我花了一段时间才发现它为什么不起作用。这没有任何意义。在这种情况下,为什么要使用位运算符而不是逻辑运算符?@Nathan Fellman-Caladain的回答似乎击中了这个问题的头部。对。作为逻辑运算符,
&
|
的优先级非常合理,但作为位运算符则没有什么意义。这是一个非常棒的非短路逻辑运算符用法。NathanFellman如果你真的需要运行
aaaa()
bbbbbb()
,并且你喜欢不可读的代码,那么如果(aaaa()==1&bbbbbb()==0),你就会写
。真的没有其他原因。那句话实际上被误引了。丹尼斯·里奇在他的论文《奇思故事》中解释了这一点。在我看来,里奇的措辞要好得多。里奇后悔拥有这样的优先权,但这样做是为了在他第一次形成C语言时,与C语言的前身B语言的转换摩擦最小。B只支持单元格上的
&
,由于B缺少类型系统,因此没有显式布尔运算符。这也解释了为什么“true”表示“not 0”——按位,并不总是产生一个完美的1。但是
=
不是短路运算符,那么为什么这能回答这个问题呢?不过,谢谢@Qix,因为你的评论也解释了为什么按位运算符都有不同的(看似任意的)先例-它们来自B,如中所示(这个问题一直困扰着我)。(我的猜测是B这样做的唯一原因就是用这种表达式语法编写递归下降解析器很容易。)