首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用预增量或后增量操作的案例

使用预增量或后增量操作的案例
EN

Stack Overflow用户
提问于 2014-03-02 03:28:50
回答 4查看 1K关注 0票数 2

阅读几个关于后增量和预增量的问题,我需要尝试解释一个新的程序员在什么样的情况下,我实际上需要一个或另一个。在什么样的场景中,我们会应用后增量操作符,在什么情况下应用预增量操作符更好。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-02 09:51:08

简单的回答是:你永远不需要他们!

长期的答案是早期微型计算机的指令集具有这样的特性。读取内存单元时,您可以在读取该单元格时对其进行增量或预减量。这种机器级的特性启发了C的前身,甚至从C到最近的语言都是从C中发现的。

要理解这一点,我们必须记住,在那些日子里,RAM是极其稀缺的。当您的程序有64k可寻址RAM时,您会发现编写非常紧凑的代码是值得的。当时的机器架构通过提供极其强大的指令来反映这一需求。因此,您可以表示如下代码:

代码语言:javascript
复制
s = s + a[j]
j = j + 1

考虑到sj在寄存器中,只有一条指令。

因此,我们在C中有一些语言特性,使得编译器无需付出很大努力就可以生成高效的代码行:

代码语言:javascript
复制
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中,并且无法承受太多的优化

例如,

代码语言:javascript
复制
a[i] *= 5

这是缩写

代码语言:javascript
复制
a[i] = a[i] * 5

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2014-03-02 09:50:03

好吧,像道格拉斯·克罗克福德这样的人反对使用这些操作符,因为它们可以通过隐藏未经训练的眼睛的最终结果而导致意想不到的行为。

但是,既然是我用的是JSHint,让我们在这里分享一个例子:

http://jsfiddle.net/coma/EB72c/

代码语言:javascript
复制
var List = function(values) {

    this.index = 0;
    this.values = values;
};

List.prototype.next = function() {

    return this.values[++this.index];
};

List.prototype.prev = function() {

    return this.values[--this.index];
};

List.prototype.current = function() {

    return this.values[this.index];
};

List.prototype.prefix = function(prefixes) {

    var i;

    for (i = 0; i < this.values.length; i++) {

        this.values[i] = prefixes[i] + this.values[i];
    }
};

var animals = new List(['dog', 'cat', 'parrot']);

console.log('current', animals.current());
console.log('next', animals.next());
console.log('next', animals.next());
console.log('current', animals.current());
console.log('prev', animals.prev());
console.log('prev', animals.prev());

animals.prefix(['Snoopy the ', 'Gartfield the ', 'A ']);

console.log('current', animals.current());
票数 3
EN

Stack Overflow用户

发布于 2014-03-02 16:45:05

正如其他人所说,您从来不需要++--运算符的任何一种风格。再说一遍,有许多语言的特性,你从来不需要,但这些功能是有用的,清楚地表达了代码的意图。您不需要返回值或一元否定的赋值,因为您总是可以编写(0-x).见鬼,如果你把它推到极限,你根本不需要C,因为你总是可以用汇编语言写东西,而且你也不需要汇编程序,因为你总是可以设置位来手工构造指令……

(当我还是男孩的时候,请听弗兰克·海斯的歌。滚出我的草坪,孩子们!)

因此,真正的答案是使用增量和递减运算符,在它们具有文体意义的地方--在这里,被操纵的值在某种意义上是一个计数器,在这里,推进“传递”计数是有意义的。循环控制是一个明显的地方,人们期望看到增量/减少,并且它读起来比替代方案更清楚。还有很多C成语几乎变成了元语言--在实际使用的语言中--例如,典型的strcpy()的一行版本--一个有经验的C程序员一眼就能认出它,并且能够在需要时重新创建;其中许多都是利用增量/递减作为副作用。

不幸的是,“在风格上有意义的地方”并不是一条简单的教学规则。与编码风格的任何其他方面一样,它确实需要来自于对其他人的代码的了解,以及对编程语言的“母语者”是如何看待代码的理解。

我知道这不是一个令人满意的答案。但我不认为还有更好的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22123467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档