使用预增量或后增量运算符的情况

标签 c

阅读有关后增量和前增量的几个问题,我需要尝试向新程序员解释在什么情况下我实际上需要一个或另一个。在什么类型的场景中可以应用后增量运算符,在什么情况下最好应用预增量运算符。

这是为了教授案例研究,在特定代码中,人们需要应用一个或另一个以获得特定任务的特定值。

最佳答案

简短的回答是:您永远不需要它们!

长话短说,早期微型计算机的指令集具有类似的功能。读取存储单元后,您可以在读取时对该单元进行后递增或预递减。这种机器级功能启发了 C 的前身,从那里它甚至进入了更近代的语言。

要理解这一点,必须记住当时 RAM 极其稀缺。当您的程序有 64k 可寻址 RAM 时,您会发现编写非常紧凑的代码是值得的。当时的机器架构通过提供极其强大的指令来反射(reflect)这种需求。因此你可以这样表达代码:

s = s + a[j]
j = j + 1

只需一条指令,假设 sj 在寄存器中。

因此我们在 C 语言中拥有允许编译器不费吹灰之力就可以生成高效代码行的语言特性:

register int s = 0;           // clr r5
s += a[j++];                  // mov j+, r6   move j to r6 and increment j after
                              // add r5,a[r6]

+=-=*=等快捷操作也是如此

他们是

  1. 一种节省打字的方法
  2. 对必须适应小 RAM 且无力进行太多优化的编译器的帮助

例如,

a[i] *= 5

这是

的缩写
a[i] = a[i] * 5

实际上为编译器节省了某种形式的公共(public)子表达式分析。

然而,所有这些语言特性,总是可以被等效的、可能更长一点的不使用它们的代码所取代。现代编译器应该将它们翻译成高效的代码,就像较短的形式一样。

因此,您的问题的底线和答案是:您不需要寻找那些需要应用这些运算符的情况。这种情况根本不会存在。

关于使用预增量或后增量运算符的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22123467/

相关文章:

c++ - bool 表达式习语中的这个字符串文字是什么?

c - 带有 LibOpenCM3 的 STM32 FreeRTOS

c - c 中运算符的地址和左值

c++ - 在 C++ 中使用 wait() 和 fork() 时出错

c - Termcap "cl"命令不清除屏幕

c - 如何为结构中指针指向的数组元素插入值

c++ - 在旧式 main() 的参数中分解 WinMain 的 cmdLine

C语言递归计数到一定数

C程序垂直线不在窗口内打印(方形)

c - 使用异步信号保证互斥安全