Epi*_*m7c -4 c c++ undefined-behavior
所以我一直在读一本 C++14 书(这是我图书馆最新的一本),尽管我比它深了大约 100-200 页,但有些东西一直在我的脑海中游动,但在某些时候它提到了这一点打脸:
i++ + ++i;
Run Code Online (Sandbox Code Playgroud)
它说不要这样做,但我还是这样做了。在 Visual Studio C++ 和在线 C++ 编译器(特别是 onlinegdb)中,它给我3when int i = 1;,但是当我分配 时i = i++ + ++i;,在线编译器给我4,Visual Studio 给我5......让我们看看, ifi++递增i但 是原始值,并且++i递增i和是新的和改进的 i,那么如果int i = 1;,我们会这样做:
1 + 2;
Run Code Online (Sandbox Code Playgroud)
并且i会是3!两个编译器都这么说。但 i = i++ + ++i;给出了不同的答案!我希望我可以验证这一点,但我无法在脑海中计算分配和增量。也许这就是编译器正在做的事情,一个在表达式中分配然后递增,另一个则做相反的事情。PEMDAS 与 PEDMAS 的精神对比。
所以我知道这是未定义行为的字面教科书示例,但无论如何我都会问一个问题:在实践中是否有未定义行为 的使用,是否有充分的理由使用这段特定的代码(可能没有)因为它的可怕性质),关于这段代码(及其交易)还有什么需要注意的吗?
在声明中:
i = i++ + ++i;
Run Code Online (Sandbox Code Playgroud)
有3个副作用:
i将赋值运算符右侧的值赋值给i作为前缀增量运算符结果的增量i作为后缀增量运算符结果的增量在这个表达式中,这些副作用中的每一个都没有相互关联的顺序。在这种特殊情况下我们有未定义行为的原因是因为在i没有插入序列点的情况下被多次修改。
在实践中有多种不同的方法可以潜在地计算结果(即可以想象的值包括3、4和5),所以确实没有充分的理由使用这样的代码。