1

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?

4

2 回答 2

7

要回答标题中的问题:

左移和 OR 运算符在 C 中是否可交换?

|位或运算符是可交换的,但<<运算符不是(a<<3并且3<<a完全不同)。

不过,这似乎不是您要问的。要回答您的问题的主体,由于<<优先级高于|(即<<绑定更紧密),您可以将a<<3它们b<<3视为主要或带括号的表达式。实际上,您有多个由|运算符连接的子表达式。重新排列它们应该没有效果;您的两个代码片段的行为应该相同(除了第二个在 中存储一个值m,该值在您的第一个片段中不存在)。

这假设您使用的所有变量都属于同一类型。如果不是,则将中间值存储在m其中可能涉及可能改变结果的转换。这可能不适用于您的情况,但由于您没有向我们展示任何声明,因此无法确定这一点。

于 2013-09-16T22:55:04.213 回答
3

在这种情况下,它应该提供相同的结果,因为 (a) 没有副作用(例如内置的前置或后置增量或减量),并且 (b)<<运算符的优先级高于|.

因此,<<操作将发生在|操作之前。

这不是交换性的问题,而是运算符之间的优先级问题。尽管它|本身是可交换的,但它确实有帮助,因为您的选择确实会改变表达式被或在一起的顺序。

于 2013-09-16T22:53:56.450 回答