语言是否需要preIncrement(++ x)和postIncrement(x ++)

Ana*_*ran 3 programming-languages increment pre-increment post-increment

我从未在实际代码中看到用于预增量后增量的用例.我经常看到它们的唯一地方是谜题.
我的观点是,它引入了更多的混淆而不是有用.

  • 是否有任何真实的用例场景
  • 这不能通过使用+ =来完成

    y = x++

    y = x
    x += 1

pax*_*blo 7

这只是编写相同内容的一种较短的方式,它只会让那些不太了解C (a)的人感到困惑.可以用相同的论点来代替:

for (i = 0; i < 10; i++)
    printf ("%d\n", i);
Run Code Online (Sandbox Code Playgroud)

有:

i = 0;
while (i < 10) {
    printf ("%d\n", i);
    i = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

因为任何for也可以用while,或:

i = 0;
loop: if (i < 10) {
    printf ("%d\n", i);
    i = i + 1;
    goto loop;
}
Run Code Online (Sandbox Code Playgroud)

因为任何循环结构都可以用条件构建goto.但是(我希望)你不会那样做,对吗?


(a)我有时喜欢向我的学生解释这个简单的陈述和副作用,这些东西允许C代码更简洁,通常没有或只有最小的可读性损失.

声明:

y = x++;
Run Code Online (Sandbox Code Playgroud)

声明被分配xy与副作用x是继递增.++x是相同的,只是事先发生副作用.

类似地,赋值的副作用是它评估为赋值,这意味着您可以执行以下操作:

while ((c = getchar()) != -1) count++;
Run Code Online (Sandbox Code Playgroud)

这使得像:

42;
Run Code Online (Sandbox Code Playgroud)

完全有效但无用的C语句.

  • @Ananantha,你错过了这一点.我所说的是,对于那个特例,你会使用"for"而不是"while"(在这种情况下,i ++/i + = 1区别是无关紧要的).底线:使用您可以使用的语言功能.了解他们. (4认同)

JUS*_*ION 6

如果您根据历史和构思时考虑它们,那么增量前和增量后运算符会更有意义.

早在C基本上是PDP-11机器的高级汇编程序的时代</flamebait>,早在我们拥有现在优秀的优化编译器之前,就会出现一些常用的习惯用语,后增量运算符非常适合.这样的事情:

char* strcpy(char* src, char* dest)
{
  /* highly simplified version and likely not compileable as-is */
  while (*dest++ = *src++);
  return dest;
}
Run Code Online (Sandbox Code Playgroud)

所讨论的代码生成了PDP-11(或其他)机器语言代码,这些代码大量使用了基本的寻址模式(如相对直接和相对间接),这些模式恰好包含了这些类型的前后增量和减量操作.

那么回答你的问题:现在语言"需要"这些吗?不,当然不.可以证明,在计算事物的指令方面你需要的很少.如果你问"这些功能是否合适?"这个问题会更有趣.为此,我会回答一个合格的"是".

使用您的示例:

y = x;
x += 1;
Run Code Online (Sandbox Code Playgroud)

y = x++;
Run Code Online (Sandbox Code Playgroud)

我可以从头顶看到两个优势.

  1. 代码更简洁.我需要知道的一切,以了解你在做什么是在一个地方(只要我知道语言,自然!)而不是分散.跨越两条线"展开"似乎是一个挑剔的事情,但如果你做了成千上万的话,它最终会产生很大的不同.
  2. 在第二种情况下,甚至由糟糕的编译器生成的代码更可能是原子的.在第一种情况下,除非你有一个很好的编译器,否则它很可能不会.(并非所有平台都有优秀,强大的优化编译器.)

另外,我觉得很,告诉你在谈论+=时本身说的"不必要"的方式x = x + 1;....毕竟没有使用的情况下我能想到的+=,可能不会被送达罚款_ = _ + _代替.

  • 使用像`x [f(y)] [g(z)] + = 10`这样的代码实际上可能比`x [f(y)] [g(z)] = x [f(y)] [更有效] g(z)] + 10`因为编译器在第一种情况下只需要计算一次"x [f(y)] [g(z)]",但在第二种情况下可能需要两次. (2认同)