示例:
Operation 1:
d= c | y | z | a<<3 | b <<3 | x;
Operation 2:
m = c|y|z|x;
d = m | a<<3 | b<<3;
操作1和操作2在C中产生相同的结果吗?
答案 0 :(得分:7)
要回答标题中的问题:
leftshift和OR运算符是否可以在C中交换?
|
按位或运算符是可交换的,但<<
运算符不是(a<<3
且3<<a
非常不同。)
但这似乎并不是你要问的问题。要回答问题的正文,由于<<
的优先级高于|
(即<<
更紧密地绑定),您可以考虑a<<3
和{{1}好像它们是主要或带括号的表达式。实际上,您有b<<3
个运算符连接的多个子表达式。重新排列它们应该没有效果;您的两个代码段应该表现相同(除了第二个代码片段在|
中存储一个值,这在第一个代码段中不存在。)
这假设您使用的所有变量属于同一类型。如果它们不存在,则将中间值存储在m
中可能涉及可能会改变结果的转换。这可能不适用于您的情况,但由于您没有向我们展示任何声明,因此无法确定这一点。
答案 1 :(得分:3)
在这种情况下,它应该提供相同的结果,因为(a)没有副作用(例如内置前后增量或减量),以及(b){ {1}}运算符的优先级高于<<
。
因此,|
操作将在<<
操作之前进行。
这不是交换性问题,而是运营商之间的优先权问题。虽然它确实有助于|
本身是可交换的,因为你的选择确实会改变表达式的组合顺序。