C中哪些运算符的优先级错误?

Jay*_*Jay 7 c operators operator-precedence

在K&R C(2E)的"简介"部分,有这一段:

与任何其他语言一样,C也有其瑕疵.一些运营商的优先顺序错误; ...

这些是哪些运营商?他们的优先权如何错?

就是其中一个案件?

Eri*_*hil 12

是的,您链接到的消息中讨论的情况是主要抱怨C中运算符的优先级.

从历史上看,C没有发展&&.为了执行逻辑AND操作,人们将使用按位AND,因此a==b AND c==d将表示为a==b & c==d.为了促进这一点,==优先级高于&.虽然&&后来被添加到语言中,&但它的优先顺序如下==.

在一般情况下,人们可能会喜欢这样写的表达(x&y) == 1更经常比x & (y==1).因此,如果&优先级高于,那就更好了==.因此人们对C运算符优先级的这一方面不满意.

这通常适用于&,^|具有比低优先级==,!=,<,>,<=,和>=.


Rus*_*usi 8

有一个明确的优先规则是无可争议的。该规则非常明确,以至于对于强类型系统(例如Pascal),错误的优先级将在编译时给出明确的语法错误。C的问题在于,由于其类型系统是自由放任的,因此错误证明是导致逻辑错误的逻辑错误,而不是编译时可捕获的错误。

规则

让??是两个类型的运算符

?:?×???
?:?×???
和?和?是不同的类型。

然后

X ??z 只能表示(x?y)?z,类型分配为
x:?,y:?,z:?

而x?(y?z)将是类型错误,因为?只能拿一个?而正确的子表达式只能产生一个?哪个不是?

现在让

将此应用到C

在大多数情况下,C都能正确处理

(==):数字×数字?布尔值
(&&):布尔值×布尔值?布尔值

所以&&应该在==以下,是这样

同样地

(+):数字×数字?数字
(==):数字×数字?布尔值

因此(+)必须高于(==),这再次正确

但是对于按位运算符

&/ | 位模式(又称数字)中的一个产生一个数字,即
(&),(|):数字×数字?数字
(==):数字×数字?布尔值

因此,典型的遮罩查询例如。x & 0x777 == 0x777
仅当(&)被视为算术运算符时才有意义,即在(==)以上

C根据上述类型规则将其置于错误的下方

当然,我已经在数学/类型推断方面表达了以上内容

在更实用的C术语中,x & 0x777 == 0x777自然地将分组为 x & (0x777 == 0x777)(在没有显式括号的情况下)

这样的分组何时可以合法使用?
我(个人)不相信有任何事情

IOW 丹尼斯·里奇Dennis Ritchie)的非正式声明(这些优先顺序是错误的)可以给予更正式的理由