我最近浏览了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=
运算符的操作。)