Как можно использовать оператор + = в C, чтобы продемонстрировать, что тот же индекс массива используется для ссылки на массив? - PullRequest
6 голосов
/ 31 января 2012

Недавно я просматривал программу Expert C Programming Питера Ван Дер Линдена и наткнулся на это использование для оператора + =:

"Если у вас сложная ссылка на массив, и вы хотите продемонстрировать, что тот же индексиспользуется для обеих ссылок, тогда:

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

- это путь ".

Сколько бы я ни пытался, я не могу понять этот код.Я надеюсь, что кто-то здесь может объяснить, что на самом деле происходит и почему его можно использовать, чтобы продемонстрировать, что используется тот же индекс?

Ответы [ 2 ]

6 голосов
/ 31 января 2012

Моя интерпретация цитаты заключается в том, что

node[COMPLICATED_EXPRESSION] += STUFF;

предпочтительнее, чем

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

, поскольку легче сразу увидеть, каково намерение.

Более того, если STUFF также сложно, так как это делает общее выражение еще сложнее с первого взгляда.

В книге ван дер Линден объясняет, откуда появился код, который он показывает:

Мы взяли этот пример выражения непосредственно из некоторого кода в операционной системе.Только имена данных были изменены, чтобы защитить виновных.

4 голосов
/ 31 января 2012

Я не читал эту книгу, поэтому могу только уйти от вашей цитаты.Я подозреваю, что он имеет в виду следующее:

Вместо записи:

array[complicated_expression] = array[complicated_expression] + something_else

(обратите внимание на две ссылки на один и тот же индекс массива)

выможно написать:

array[complicated_expression] += something_else

Это дает понять, что сложное выражение одинаково в "обеих ссылках".

Альтернативный способ сделать это - использовать временную переменную:

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

Но это не так кратко.(Это более общий подход, поскольку вы можете использовать его для случаев, когда вы выполняете какую-либо операцию, в которой нет оператора X=.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...