Ana*_*ran 3 programming-languages increment pre-increment post-increment
我从未在实际代码中看到用于预增量和后增量的用例.我经常看到它们的唯一地方是谜题.
我的观点是,它引入了更多的混淆而不是有用.
这不能通过使用+ =来完成
y = x++
y = x
x += 1
这只是编写相同内容的一种较短的方式,它只会让那些不太了解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)
该声明被分配x到y与副作用x是继递增.++x是相同的,只是事先发生副作用.
类似地,赋值的副作用是它评估为赋值,这意味着您可以执行以下操作:
while ((c = getchar()) != -1) count++;
Run Code Online (Sandbox Code Playgroud)
这使得像:
42;
Run Code Online (Sandbox Code Playgroud)
完全有效但无用的C语句.
如果您根据历史和构思时考虑它们,那么增量前和增量后运算符会更有意义.
早在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)
我可以从头顶看到两个优势.
另外,我觉得很,告诉你在谈论+=时本身说的"不必要"的方式x = x + 1;....毕竟没有使用的情况下我能想到的+=,可能不会被送达罚款_ = _ + _代替.