C语言有预增量和后增量的历史原因是什么?

Sha*_*ang 10 c c++ pre-increment post-increment decrement

(注意:我不是在询问预增量与后增量的定义,或者它们在C/C++中的使用方式.因此,我不认为这是一个重复的问题.)

C的开发人员(Dennis Ritchie等人)出于很好的理由创建了增量和减量运算符.我不明白为什么他们决定创造前后增量/减量的区别?

我的感觉是,当C开发时,这些运算符比今天更有用.大多数C/C++程序员使用其中一种,而来自其他语言的程序员今天发现这种区别奇怪且令人困惑(注意:这完全基于轶事证据).

他们为什么决定这样做,以及计算上发生了什么变化,这种区别今天没那么有用?

为了记录,可以在C++代码中看到两者之间的差异:

int x = 3;

cout << "x = 3; x++ == " << x++ << endl;
cout << "++x == " << ++x << endl;
cout << "x-- == " << x-- << endl;
cout << "--x == " << --x << endl;
Run Code Online (Sandbox Code Playgroud)

将作为输出

x++ == 3
++x == 5
x-- == 5
--x == 3
Run Code Online (Sandbox Code Playgroud)

usr*_*301 10

当时硬件广泛支持递增和递减1:单个操作码,并且速度快.这是因为"递增1"和"递减1"是代码中非常常见的操作(直到今天).

post和precrement表单仅影响在生成的机器代码中插入此操作码的位置.从概念上讲,这模仿了" 使用结果之前之后增加/减少".在一个声明中

i++;
Run Code Online (Sandbox Code Playgroud)

没有使用'之前/之后'概念(因此它的作用相同++i;),但是在

printf ("%d", ++i);
Run Code Online (Sandbox Code Playgroud)

它是.现在,这种区别与设计语言C时的区别同样重要(这个特定的习语是从它的前身"B"中复制而来的).

C语言的发展谈起

这个特征[PDP-7的"自动增量"存储单元"]可能会向Thompson [Ken Thompson,他设计的"B",C的前身)建议这样的操作员.使它们成为前缀和后缀的概括是他自己的.实际上,自动增量单元并没有直接用于运算符的实现,而且创新的更强烈动机可能是他观察到++ x的翻译小于x = x + 1的翻译.

感谢@dyp提及此文档.

  • Ritchie,C语言的发展:*"人们经常猜测它们的创建是为了使用DEC PDP-11提供的自动递增和自动递减地址模式,C和Unix最初在这种模式下流行.这在历史上是不可能的因为在开发B时没有PDP-11."*PDP-7似乎有一些可能发挥作用的功能,虽然我不认为从文件中完全清楚它们是主要的原因.前缀和后缀`++`的存在. (6认同)
  • "翻译比较小".所以在这里你有歇斯底里的葡萄干:**在早期的编译器中缺乏优化器**. (2认同)

pmg*_*pmg 5

当你倒计时时,n无论是预减还是减后都是非常重要的

#include <stdio.h>
void foopre(int n) {
    printf("pre");
    while (--n) printf(" %d", n);
    puts("");
}
void foopost(int n) {
    printf("post");
    while (n--) printf(" %d", n);
    puts("");
}
int main(void) {
    foopre(5);
    foopost(5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

查看在ideone上运行代码.