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运算符优先级的这一方面不满意.
这通常适用于&,^和|具有比低优先级==,!=,<,>,<=,和>=.
有一个明确的优先规则是无可争议的。该规则非常明确,以至于对于强类型系统(例如Pascal),错误的优先级将在编译时给出明确的语法错误。C的问题在于,由于其类型系统是自由放任的,因此错误证明是导致逻辑错误的逻辑错误,而不是编译时可捕获的错误。
让??是两个类型的运算符
?:?×???
?:?×???
和?和?是不同的类型。
然后
X ??z 只能表示(x?y)?z,类型分配为
x:?,y:?,z:?
而x?(y?z)将是类型错误,因为?只能拿一个?而正确的子表达式只能产生一个?哪个不是?
现在让
在大多数情况下,C都能正确处理
(==):数字×数字?布尔值
(&&):布尔值×布尔值?布尔值
所以&&应该在==以下,是这样
同样地
(+):数字×数字?数字
(==):数字×数字?布尔值
因此(+)必须高于(==),这再次正确
但是对于按位运算符
&/ | 位模式(又称数字)中的一个产生一个数字,即
(&),(|):数字×数字?数字
(==):数字×数字?布尔值
因此,典型的遮罩查询例如。x & 0x777 == 0x777
仅当(&)被视为算术运算符时才有意义,即在(==)以上
C根据上述类型规则将其置于错误的下方
当然,我已经在数学/类型推断方面表达了以上内容
在更实用的C术语中,x & 0x777 == 0x777自然地将分组为
x & (0x777 == 0x777)(在没有显式括号的情况下)
这样的分组何时可以合法使用?
我(个人)不相信有任何事情
IOW 丹尼斯·里奇(Dennis Ritchie)的非正式声明(这些优先顺序是错误的)可以给予更正式的理由