当前位置: 首页 > 知识库问答 >
问题:

那么为什么i=++i+1在C++11中定义得很好呢?

越伟泽
2023-03-14
i = ++i + 1
     ^
     |
assignment (side effect on i)
 ^      ^
 |      |
☆i   ++i + 1
     ||    ^
    i+=1   |
     ^     1
     |
★assignment (side effect on i)
  ^      ^
  |      |
  i      1

如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值进行的值计算没有排序,则行为是未定义的。

缺陷报告中的解释没有帮助我理解。lvalue-to-rvalue转换与任何事情有什么关系?我错在哪里了?

共有1个答案

壤驷雅达
2023-03-14

...或使用同一标量对象的值进行值计算...

重要的部分在这里加粗。左侧不使用i的值进行值计算。正在计算的是GLVALUE。只有在之后(在之后排序),对象的值才会被触摸和替换。

不幸的是,这是一个非常微妙的点:)

 类似资料:
  • 好吧,所以那里没有UB。现在我的问题是,如果将赋值运算符从更改为(或类似运算符),会发生什么。 表达式的求值是否导致未定义的行为? 在我看来,这个标准在这里似乎自相矛盾。由于的LHS仍然是一个L值(其RHS仍然是一个prvalue),就(1)和(2)而言,同样的推理也适用;在上的操作数的计算中没有未定义的行为。对于(3),复合赋值的操作(更准确地说是该操作的副作用;如果需要,它的值计算在任何情况下

  • 问题内容: 我在一个开始从事的项目中遇到了这段代码。原始开发人员不再可用,我对此一无所知: 产生值为。这是如何运作的? 什么是运算符? 什么是运算符? 什么是运算符? 什么是运算符? 问题答案: 什么是运算符? 那是两个运算符,一个是赋值运算符,一个是一元加号,它什么都不做。 您是否输入错了并表示compund赋值运算符? 什么是运算符? 还有两个运算符,一个为后递增,一个为加法(根据最大划分规则

  • 问题内容: 我今天发现了一件奇怪的事情,想知道是否有人可以阐明其中的区别? 运行完每个循环后,没有改变,但是在每个元素中添加了一个。我实际上使用该版本在循环内写入初始化的NumPy数组。 问题答案: 不同之处在于,一个修改数据结构本身(就地操作),而另一个仅 重新分配 变量。 仅出于完整性考虑: 是 不是总是 做就地操作,有(至少)三种例外情况: 如果 没有实现 的则方法的声明仅仅是一个速记。如果

  • 问题内容: 以下Java程序平均需要0.50秒至0.55秒的时间运行: 如果我替换为,则需要0.60到0.65秒的时间来运行。怎么会? 我对该程序的每个版本运行了15次,两次交替运行。结果如下: 最快的运行时间比最慢的运行时间长。如果它们具有相同的效率,则发生这种情况的可能性将小于。 问题答案: 字节码的顺序略有不同。 : vs : 乍看之下,这没有什么区别;如果有的话,第二个版本更理想,因为它减

  • 本文向大家介绍为什么“ while(i ++ 相关面试题,主要包含被问及为什么“ while(i ++ 时的应答技巧和注意事项,需要的朋友参考一下 正如其他人指出的那样,该测试在许多方面都有缺陷。 你没有告诉我们到底 如何 ,你做了这个测试。但是,我试图实施这样的“幼稚”测试(无冒犯): 当使用默认设置运行它时,似乎有很小的差异。但是,当您使用该标志运行基准测试时,基准测试的 真正 缺陷就变得显而

  • 问题是,如果变量i是int的话,哪一个性能更好。 我正在寻找性能方面的内存块或寄存器所需的和CPU周期所需的这两种情况。