Я смотрю на некоторый код профессора Дона Кнута, написанный на CWEB, который конвертируется в C. Конкретный пример - dlx1.w, доступный на веб-сайте Knuth.
На одном этапе значение .len struct nd [cc] уменьшается, и это делается неуклюже:
o,t=nd[cc].len-1;
o,nd[cc].len=t;
(Это специфичный для Кнута вопрос, поэтому, возможно, вы уже знаете, что "o" - это макрос препроцессора для увеличения "мемов", который представляет собой промежуточный итог затраченных усилий, измеряемый путем доступа к 64-битным словам.) Значение, оставшееся в "t", определенно не используется ни для чего другого. (Примером здесь является строка 665 dlx1.w или строка 193 dlx1.c после ctangle.)
Мой вопрос: почему Кнут пишет это так, а не
nd[cc].len--;
который он фактически использует в другом месте (строка 551 из dlx1.w):
oo,nd[k].len--,nd[k].aux=i-1;
(И "oo" - аналогичный макрос для увеличения "mems" в два раза - но здесь есть некоторая тонкость, потому что .len и .aux хранятся в одном и том же 64-битном слове. Чтобы присвоить значения S.len и S. aux, обычно учитывается только одно приращение к мемам.)
Моя единственная теория заключается в том, что декремент состоит из двух обращений к памяти: сначала для поиска, затем для присвоения. (Это правильно?) И этот способ написания это напоминание о двух шагах. Это было бы необычно многословно для Кнута, но, возможно, это инстинктивная памятная записка, а не дидактизм.
Для чего это стоит, я искал в документации CWEB, не найдя ответа. Мой вопрос, вероятно, больше относится к стандартным практикам Кнута, которые я постепенно поднимаю. Я был бы заинтересован в любых ресурсах, где эти практики изложены (и, возможно, критикованы) как блок - но сейчас давайте сосредоточимся на том, почему Кнут пишет это так.