C. ++ vs | =中的操作顺序,首先出现?

时间:2010-05-19 13:06:51

标签: c operator-precedence

我正在阅读以下代码:

if( (i%2) == 0 ){ 
    *d = ((b & 0x0F) << 4); 
}
else{
    *d++ |= (b & 0x0F); 
};

我正在专门研究else声明,并想知道这种情况发生的顺序是什么?我没有常规的C编译器,所以我无法测试这个。当我们执行*d++ |= (b & 0x0F);时,会发生什么顺序?

8 个答案:

答案 0 :(得分:11)

++应用于指针d,而不是*d上分配的左值。

如果你真的想,你可以这样想:

  1. b的值是按位-AND:带有常量0x0f
  2. 结果位模式是按位OR:编入d指向的值。
  3. 指针d递增以指向下一个值。

答案 1 :(得分:5)

d ++返回递增前的值d。然后由*取消引用,该位置是执行| =的位置。因此,在递增d之前的位置处的数据将具有(b&amp; 0x0F)值。

通常,如果一行代码中的操作顺序一目了然,请将该行重构为其组成操作,直到它为止。只需将大量操作压缩到一行C上,生成的代码就不会变得更快或更紧凑!没有充分理由以这种方式牺牲可理解性。用

替换该行
*d |= (b & 0x0F); 
d++;

答案 2 :(得分:2)

首先执行|=的右侧部分,然后完成*d |=分配,然后d递增。通常当你有代码导致类似的问题时,你应该为了清楚起见而重写它。

答案 3 :(得分:2)

++将在|=之前发生。赋值运算符位于优先级图的底部。

答案 4 :(得分:0)

This link(C ++ Operator Precedence)应该给你答案。

答案 5 :(得分:0)

先完成

++。但是,后增量(即d++此处)等同于此(temp=d, d++, temp)

答案 6 :(得分:0)

根据http://www.cppreference.com/wiki/operator_precedence

它将评估(b&amp; 0x0F)然后对它应用| =并将其分配给* b,最后递增指向* b的值。

答案 7 :(得分:0)

表达式*d++ |= (b & 0x0F)分解如下:

  1. 表达式*d++b & 0x0F每次都被评估一次(未指定它们的评估顺序;编译器可以在b & 0x0F之前自由评估*d++结果不依赖于评估发生的顺序);
  2. (b & 0x0F)的结果与*d++;
  3. 的结果按位或按位
  4. 按位或运算的结果存储在d;
  5. 最初指向的位置
  6. 在所有这些中的某个时刻,d的值会更新。
  7. 表达式*d++被解析为*(d++);即您正在取消引用表达式d++的结果。表达式d++计算为d的当前值,并且在下一个序列点(在本例中为语句的结尾)之前的某个未指定的点处,该值d的更新。更新d的副作用不必立即应用;它可以在分配之前或之后发生。