![]() |
1
169
奇怪的是,其他两个答案似乎没有拼出来,绝对值得说:
它们是预增量、后增量运算符。 在这两种情况下,变量都是递增的 但是,如果在完全相同的情况下获取这两个表达式的值,结果会有所不同。 |
![]() |
2
400
不幸的是,这个问题的典型答案已经在这里发布了,一个在剩余操作之前执行增量操作,另一个在剩余操作之后执行增量操作。 尽管这一观点直观地得到了理解,但这种说法表面上是完全错误的。 . 这个 事件的时间顺序 在C中定义得非常清楚,并且强调 不 前缀和后缀版本对其他操作的处理顺序不同的情况。 毫无疑问,你会看到这个问题的很多错误答案。很多“自学C”的书也会弄错。而且,C做的方式与C做的方式不同。许多人认为C和C是同一种语言,但事实并非如此。在我看来,C中的递增和递减操作符的设计避免了C中这些操作符的设计缺陷。 有两个问题必须回答才能确定前缀和后缀++在C中的具体操作。第一个问题是 结果如何? 第二个问题是 增量的副作用何时发生? 这两个问题的答案都不明显,但事实上,一旦你看到它,就相当简单了。让我为您详细说明X++和X++对变量X的作用。 对于前缀形式:
对于后缀表单:
需要注意的一些事项: 第一, 两种情况下事件的时间顺序完全相同 . 再说一遍,绝对是 不 在这种情况下, 事件的时间顺序 前缀和后缀之间的更改。说评估发生在其他评估之前或之后是完全错误的。评估发生在 完全一样的顺序 在这两种情况下,您可以通过步骤1到4看到相同。这个 只有 区别在于 最后一步 -结果是临时值还是新的递增值。 您可以通过一个简单的C控制台应用程序轻松地演示这一点:
以下是结果…
在第一个测试中,您可以看到
然而,在第二种情况下,人们会试图告诉你
在这种情况下,首先
令人惊讶的是,人们对优先级、关联性和副作用的执行顺序感到非常困惑,我怀疑主要是因为C.C.中的混乱被精心设计成在所有这些方面都不那么混乱。对于这些问题的一些额外分析,包括我进一步证明了前缀和后缀操作“及时移动内容”的观点是错误的,请参见: http://blogs.msdn.com/b/ericlippert/archive/2009/08/10/precedence-vs-order-redux.aspx 这就引出了这样一个问题: int[] arr={0}; int value = arr[arr[0]++]; Value = 1? 你也可能对我之前关于这个主题的文章感兴趣: http://blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx 和 http://blogs.msdn.com/b/ericlippert/archive/2007/08/14/c-and-the-pit-of-despair.aspx 还有一个有趣的例子,C使得很难解释正确性: http://blogs.msdn.com/b/ericlippert/archive/2005/04/28/bad-recursion-revisited.aspx 此外,在考虑其他具有副作用的操作时,我们也遇到了类似的微妙问题,例如链接的简单分配: 下面是一篇有趣的文章,讨论为什么增量运算符会导致 价值观 C而不是 变量 : |
![]() |
3
20
如果你有:
然后
但如果你有:
然后
请注意,正如Eric指出的,在这两种情况下,增量是同时发生的,但结果不同的是给出的值(谢谢Eric!).
一般来说,我喜欢用
或者,如果我只需要增加一个变量,我喜欢使用:
通常情况下,一种方法或另一种方法没有太大的意义,可以归结为编码样式,但是如果您在其他分配中使用运算符(如在我的原始示例中),那么注意潜在的副作用是很重要的。 |
![]() |
4
5
这能回答你的问题吗? |
![]() |
5
5
运算符的工作方式是同时递增,但如果它在变量之前,则表达式将使用递增/递减的变量进行计算:
如果它在变量之后,则当前语句将使用原始变量执行,就好像它尚未递增/递减:
我同意DCP使用预增/减(++X),除非必要。实际上,我唯一一次使用后递增/递减是在while循环或类似的循环中。这些循环是相同的:
或
您还可以在索引数组等时执行此操作:
等等。 |
![]() |
6
4
就记录而言,在C++中,如果你可以使用(即)你不关心操作的顺序(你只想增加或减量并在以后使用它),前缀操作符是更高效的,因为它不必创建对象的临时副本。不幸的是,大多数人使用posfix(var++)而不是前缀(++var),这是我们最初学到的。(我在一次采访中被问及此事)。不确定这在C中是否正确,但我想应该是。 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |