Sch*_*ote 7 c c++ language-design
在C及其许多衍生产品中,i++增量i并计算增值i前的值,并++i递增i并计算增值i 后的值.
我可以看到特定增量运算符的推理; 当时许多处理器都有一个比添加更快的特殊增量操作码,而概念上"增量"与"添加"是一个不同的概念,理论上它们的编写方式可能会使代码更具可读性.
我不明白的是需要预增量运算符.不能用它写任何实际用途吗?
#This...
x = i++;
#becomes this:
x = i;
++i;
Run Code Online (Sandbox Code Playgroud)
可能有一个我不知道的历史原因吗?你是否无法"抛弃"原始版本的C中运算符的返回值?
Mic*_*ick 12
一个原因是,只要程序员知道他(或她)正在做什么,它就可以在编译器中没有任何花哨的优化阶段的情况下生成有效的代码.例如,将字符从一个缓冲区复制到另一个缓冲区时,您可能具有:
register char *ptr1;
register char *ptr2;
...
for ( ... ) {
*ptr1++ = *ptr2++; /* post-increment */
}
Run Code Online (Sandbox Code Playgroud)
我曾经使用的编译器(在专有的小型机上)将为赋值生成以下寄存器操作:
load $r1,*$a1++ // load $r1 from address in $a1 and increment $a1
store $r1,*$a2++ // store $r1 at address in $a2 and increment $a2
Run Code Online (Sandbox Code Playgroud)
我忘记了实际的操作码.编译器不包含优化阶段,但它生成的代码非常紧凑,前提是您了解编译器和机器架构.它可以做到这一点,因为硬件架构具有地址寄存器和通用寄存器的预递减和后递增寻址模式.据我所知,没有预增量和后减量寻址模式,但没有这些模式你可以顺利完成.
我相信最初开发C的DEC小型机具有这样的寻址模式.我工作的机器不是由DEC制造的,但架构非常相似.
计划编译器的优化阶段.但是,它主要由系统程序员使用,当他们看到生成的代码有多好时,优化阶段的实现被悄然搁置.
C设计的全部基本原理是允许创建简单易用的编译器,这些编译器可以通过最少(或没有)中间代码优化生成合理有效的代码.由于这个原因,递增和递减运算符以及复合赋值运算符在早期C编译器生成紧凑和高效代码中起到了重要作用.它们不仅仅是Niklaus Wirth等人提出的语法糖.