i++ + ++i有什么关系?

问题描述 投票:0回答:1

所以我一直在读一本 C++14 的书(这是我图书馆的最新一本书),虽然我比它深了大约 100-200 页,但有些东西一直在我脑海中游动,但在某些时候它提到这一巴掌:

i++ + ++i;

它说不要这样做,但我还是做了。在 Visual Studio C++ 和在线 C++ 编译器(特别是 onlinegdb)中,它在

3
时给我
int i = 1;
,但是当我分配
i = i++ + ++i;
时,在线编译器给我
4
,而 Visual Studio 给我
5
.. . 让我们看看,如果
i++
递增
i
但是是原始值,并且
++i
递增
i
并且是新的和改进的
i
,那么如果
int i = 1;
,我们将是做:

1 + 2;

i
会是
3
!两个编译器都这么说。 然而
i = i++ + ++i;
给出了不同的答案!我希望我能验证这一点,但我无法在脑海中计算分配和增量。也许这也是编译器正在做的事情,一个是赋值然后在表达式中递增,另一个则相反。一种 PEMDAS 与 PEDMAS 的精神在行动。

所以我知道这是一个 literal 未定义行为的教科书示例,但我还是要问这个问题:是否有任何使用 undefined behavior in practice, is there ever a good reason to use this specific piece代码(可能不是因为它的怪异性质),关于这段代码(及其交易)还有什么需要注意的吗?

c++ c undefined-behavior
1个回答
1
投票

声明中:

i = i++ + ++i;

有3个副作用:

  • 将赋值运算符右边的值赋值给
    i
  • i
    的增量作为前缀增量运算符
  • i
    的增量作为后缀增量运算符的结果

在这个表达式中,这些副作用中的每一个都没有相互关联。在这种特殊情况下我们有未定义行为的原因是因为

i
在没有中间序列点的情况下被修改了不止一次。

在实践中有许多不同的方法可以计算结果(即可能的值包括 3、4 和 5),因此确实没有充分的理由使用这样的代码。

© www.soinside.com 2019 - 2024. All rights reserved.