我正在阅读以下代码:
if( (i%2) == 0 ){
*d = ((b & 0x0F) << 4);
}
else{
*d++ |= (b & 0x0F);
};
我正在专门研究else
声明,并想知道这种情况发生的顺序是什么?我没有常规的C编译器,所以我无法测试这个。当我们执行*d++ |= (b & 0x0F);
时,会发生什么顺序?
答案 0 :(得分:11)
++应用于指针d
,而不是*d
上分配的左值。
如果你真的想,你可以这样想:
b
的值是按位-AND:带有常量0x0f
的d
指向的值。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)
分解如下:
*d++
和b & 0x0F
每次都被评估一次(未指定它们的评估顺序;编译器可以在b & 0x0F
之前自由评估*d++
结果不依赖于评估发生的顺序); (b & 0x0F)
的结果与*d++
; d
的值会更新。表达式*d++
被解析为*(d++)
;即您正在取消引用表达式d++
的结果。表达式d++
计算为d
的当前值,并且在下一个序列点(在本例中为语句的结尾)之前的某个未指定的点处,该值d
的更新。更新d
的副作用不必立即应用;它可以在分配之前或之后发生。