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



我最近浏览了Peter Van Der Linden的Expert C Programming,发现了+=运算符的用法:

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

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

是要走的路。"

尽管我已经尝试了很多,但我还是弄不清这个代码。我希望这里有人能解释到底发生了什么,为什么它可以用来证明使用了相同的索引?

我对报价的解释是

node[COMPLICATED_EXPRESSION] += STUFF;

比更好

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

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

如果STUFF也很复杂,情况会更糟,因为这会使整个表达式更难一目了然地解析。

范德林登在书中解释了他展示的代码来自哪里:

我们直接从一些操作系统中的代码。仅更改了数据名称保护罪犯。

我还没有读过有问题的书,所以我只能引用你的话。我怀疑他指的是:

代替书写:

array[complicated_expression] = array[complicated_expression] + something_else

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

你可以写:

array[complicated_expression] += something_else

这清楚地表明,"两个引用"中的复杂表达式是相同的。

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

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

但这并不是那么简洁。(不过它更通用,因为您可以将它用于没有X=运算符的操作。)

最新更新