Одна из причин заключается в том, что он позволил генерировать эффективный код без каких-либо фаз оптимизации оптимизации в компиляторах, prov что программист знал, что он (или она) делает. Например, при копировании символов из одного буфера в другой, вы можете иметь:
register char *ptr1;
register char *ptr2;
...
for (...) {
*ptr1++ = *ptr2++; /* post-increment */
}
компилятор, который я когда-то работал с (на собственном миникомпьютере) будут генерировать следующие операции регистра для выполнения задания:
load $r1,*$a1++ // load $r1 from address in $a1 and increment $a1
store $r1,*$a2++ // store $r1 at address in $a2 and increment $a2
Я забыл фактические коды операций. Компилятор не содержал фазы оптимизации, но код, который был сгенерирован, был очень плотным, при условии, что вы поняли компилятор и архитектуру машины. Он мог бы сделать это, потому что в аппаратной архитектуре были режимы адресации до начала декремента и пост-инкрементной обработки как для регистров адресов, так и для общих регистров. Насколько я помню, не было режимов предварительной настройки и пост-декрементной адресации, но вы могли обойтись без них.
Я считаю, что мини-ЭВМ DEC, на которых первоначально был разработан C, имели такие режимы адресации. Машина, над которой я работал, не была сделана DEC, но архитектура была очень похожа.
Фаза оптимизации была запланирована для компилятора. Тем не менее, он в основном использовался системными программистами, и когда они видели, насколько хорош сгенерированный код, реализация фазы оптимизации была тихо отложена.
Все логическое обоснование конструкции C состояло в том, чтобы создать простые и портативные компиляторы, которые могли бы генерировать достаточно эффективный код с минимальной (или нет) промежуточной оптимизацией кода. По этой причине операторы приращения и декремента, а также составные операторы присваивания сыграли важную роль в генерации компактного и эффективного кода ранними компиляторами C. Они были не просто синтаксическим сахаром, как предложил Никлаус Вирт и др.
Можно ли отредактировать этот вопрос, чтобы довести его до масштабов? Я с удовольствием отредактирую свой ответ и добавлю какой-то исторический контекст, но я не буду больше заниматься этим, пока вопрос не будет снят. Мне также нужно знать, какие операторы приращения решаются (извините за каламбур). – Mick
[Этот вопрос обсуждается по мета] (http://meta.stackoverflow.com/questions/335085/is-it-okay-to-delete-and-re-make-a-question-to-stop-everyone -hyperfocusing-on-a) и после удаления здесь было [повторно запрошено в уточненной форме на Programmers] (http://programmers.stackexchange.com/questions/331870/origins-of-having-both-prefix- incrementi-и-постфикс-incrementi-в). Для прозрачности, пока эти обсуждения продолжаются, я восстановил ее здесь и наложил временную (1-дневную) блокировку. – Shog9