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

i = i等的未定义行为规则

万修然
2023-03-14

我一直在温习我未定义的行为规则,并阅读了以下内容:

定义的行为和序列点
为什么f(i=-1,i=-1)行为未定义
为什么`x--

在C 11中,“i = i 1”是否表现出未定义的行为?

最后有三个问题:

    < li >形式为< code>i=i 的术语的未定义行为规则是否适用于非整型?(表达式应翻译为< code > I . operator(I . operator(I)),由于每个函数调用都是一个序列点,如果我对标准理解正确的话,它应该是明确定义的) < li >为什么< code>f(i=-1,i=-1)与“赋值操作的结果是赋值发生后存储在左操作数中的值;结果是一个左值"(ref)[https://stack overflow . com/a/4190054/258418]?(我理解I的值是事后未定义的,但如果我理解标准正确的话,functioncall应该求值为< code>f(-1,-1)。 < li >在c 11/14/1z中,哪些类型的表达式变得安全,只有简单赋值(no op=)中的预递增/预递减?

共有1个答案

长孙阳泽
2023-03-14

忘记f(i=-1, i=-1)。假设您有两个指针int*pint*q,然后您调用

f (*p = 1, *q = 2)

如果p==q,这是未定义的行为。如果你不希望它是未定义的行为,你将如何定义p==q情况下的行为?(因为如果你不喜欢它是未定义的,你必须以某种方式定义它)。此外,你会接受行为的定义吗?这意味着99.999%的代码可能会运行得慢一点,以保存一些明显愚蠢的代码?

然后案子就来了

f (*p = -1, *q = -1)

因此,相同的值被分配。如果你希望这是定义的行为,但不分配不同的值,你究竟如何建议将其纳入一个合理的规则?

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

  • 考虑以下C程序: null 访问易失性对象、修改对象、修改文件,或者调用执行那些操作中的任何操作的函数都是副作用,它们是执行环境状态的改变。表达式的计算通常包括值计算和副作用的启动。用于lvalue表达式的值计算包括确定指定对象的标识。 Sequenced before是单线程执行的计算之间的非对称、传递、成对关系,它导致这些计算之间的部分顺序。给定任意两个评价A和B,如果A排序在B之前,那么A的

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

  • 问题内容: 哪个更正确?Java的结果为12或C =13。或者,如果不是正确性,请详细说明。 问题答案: 没有比这更正确的了。它实际上是未定义的,称为序列点错误。 http://en.wikipedia.org/wiki/Sequence_point

  • 是 i = 表达式;等于i =表达式,那么登录的目的是什么? 大家好,我对下面这个问题很困惑;i =表达式;//意味着i = i表达式那么这个i =表达式呢;//我在eclipse上进行了测试,简单地找到了结果i = expression 所以 i = 表达式;等于 i = 表达式 那么登录的目的是什么? 我知道黑白 i(前增量)和 i(后增量)的区别 谢谢你!

  • 如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值进行的值计算没有排序,则行为是未定义的。 缺陷报告中的解释没有帮助我理解。lvalue-to-rvalue转换与任何事情有什么关系?我错在哪里了?