【问题标题】:Is this undefined behavior or implementation defined?这个未定义的行为或实现是否已定义?
【发布时间】:2012-07-25 19:26:12
【问题描述】:

以下是未定义的还是实现定义的:

 int x = 0;
 printf("%d%d", ++x, x);

未指定评估参数的顺序,因此:

  • 如果首先评估++x,则输出11
  • 如果首先评估x,它会打印10

【问题讨论】:

  • 你不是自己回答的吗?未指定。
  • @ninjalj:出于同样的原因,我可以争辩说,由于标准中没有定义地址零处的值,*0 会产生实现定义的行为。
  • @ninjalj:他没有问是否未指定。他询问它是未定义的,还是已定义的实现。所以不,他自己没有回答。

标签: c++ undefined-behavior


【解决方案1】:
printf("%d%d", ++x, x);

这显然是 C++ 中未定义的行为。

(C++11, 1.9p15) "如果对标量产生副作用 相对于同一标量对象的另一个副作用或值计算,对象是无序的 使用相同标量对象的值,行为是未定义的。”

C 也一样(重点是我的):

(C99, 6.5.p2) "在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。72) 此外,先前的值应为只读确定要存储的值.73"

请注意,C11 现在的措辞与 C++11 中的类似:

(C11, 6.5p2) “如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值的值计算是无序的,则行为未定义。 "

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2019-09-26
    相关资源
    最近更新 更多