如何使用C中的+ =运算符来证明相同的数组索引用于数组引用?

时间:2012-01-31 18:43:42

标签: c bit-manipulation

我最近通过Peter Van Der Linden查看了Expert C Programming,并且发现了+ =运算符的这种用法:

“如果您有一个复杂的数组引用,并且您想要证明两个引用都使用相同的索引,那么:

node[i >> 3] += ~(0x01 << (i & 0x7)); 

是要走的路。“

尽管我已经尝试过,但我无法弄清楚这段代码。我希望有人可以解释实际发生的事情以及为什么可以用来证明使用相同的索引?

2 个答案:

答案 0 :(得分:6)

我对引言的解释是

node[COMPLICATED_EXPRESSION] += STUFF;

优于

node[COMPLICATED_EXPRESSION] = node[COMPLICATED_EXPRESSION] + STUFF;

因为一眼就能看出目的是什么。

如果STUFF也很复杂,那么更多,因为这使整体表达式更难以一目了然地解析。

在书中,范德林登解释了他所展示的代码来自何处:

  

我们直接从一些中获取了这个示例语句   操作系统中的代码。仅更改了数据名称   保护有罪者。

答案 1 :(得分:4)

我还没看过这本书,所以我只能说你的报价。我怀疑他指的是这个:

而不是写作:

array[complicated_expression] = array[complicated_expression] + something_else

(注意两个对数组相同索引的引用)

你可以写:

array[complicated_expression] += something_else

这清楚地表明复杂的表达式在“两个引用”中都是相同的。

另一种方法是使用临时变量:

int index = complicated_expression;
array[index] = array[index] + something_else

但这并不简洁。 (虽然它更为通用,因为您可以在没有X=运算符的情况下使用它。)