Example:
Operation 1:
d= c | y | z | a<<3 | b <<3 | x;
Operation 2:
m = c|y|z|x;
d = m | a<<3 | b<<3;
does operation 1 and operation 2 yield same results in C?
Example:
Operation 1:
d= c | y | z | a<<3 | b <<3 | x;
Operation 2:
m = c|y|z|x;
d = m | a<<3 | b<<3;
does operation 1 and operation 2 yield same results in C?
要回答标题中的问题:
左移和 OR 运算符在 C 中是否可交换?
按|
位或运算符是可交换的,但<<
运算符不是(a<<3
并且3<<a
完全不同)。
不过,这似乎不是您要问的。要回答您的问题的主体,由于<<
优先级高于|
(即<<
绑定更紧密),您可以将a<<3
它们b<<3
视为主要或带括号的表达式。实际上,您有多个由|
运算符连接的子表达式。重新排列它们应该没有效果;您的两个代码片段的行为应该相同(除了第二个在 中存储一个值m
,该值在您的第一个片段中不存在)。
这假设您使用的所有变量都属于同一类型。如果不是,则将中间值存储在m
其中可能涉及可能改变结果的转换。这可能不适用于您的情况,但由于您没有向我们展示任何声明,因此无法确定这一点。
在这种情况下,它应该提供相同的结果,因为 (a) 没有副作用(例如内置的前置或后置增量或减量),并且 (b)<<
运算符的优先级高于|
.
因此,<<
操作将发生在|
操作之前。
这不是交换性的问题,而是运算符之间的优先级问题。尽管它|
本身是可交换的,但它确实有帮助,因为您的选择确实会改变表达式被或在一起的顺序。