C++ 是否定义了此未定义的行为或实现?

C++ 是否定义了此未定义的行为或实现?,c++,undefined-behavior,C++,Undefined Behavior,以下内容是否未定义或实现是否已定义: int x = 0; printf("%d%d", ++x, x); 未指定参数的求值顺序,因此: 如果先计算++x,则会打印11 如果先计算x,则打印10 这是C++中明显未定义的行为。 (C++11,1.9p15)“如果对标量有副作用 对象相对于同一标量对象上的另一个副作用或值计算未排序 使用同一标量对象的值,行为未定义。“ 与C相同(强调我的): (C99,6.5.p2)“在上一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的求值修

以下内容是否未定义或实现是否已定义:

 int x = 0;
 printf("%d%d", ++x, x);
未指定参数的求值顺序,因此:

  • 如果先计算
    ++x
    ,则会打印
    11
  • 如果先计算
    x
    ,则打印
    10

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

(C++11,1.9p15)“如果对标量有副作用 对象相对于同一标量对象上的另一个副作用或值计算未排序 使用同一标量对象的值,行为未定义。“

与C相同(强调我的):

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

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

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

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

(C++11,1.9p15)“如果对标量有副作用 对象相对于同一标量对象上的另一个副作用或值计算未排序 使用同一标量对象的值,行为未定义。“

与C相同(强调我的):

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

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

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


你刚才不是自己回答了吗?它是未指定的。@ninjalj:根据同样的推理,我可以说,由于地址0处的值未在标准中定义,
*0
产生实现定义的行为。@ninjalj:他没有问它是否未指定。他问它是未定义的,还是实现定义的。所以不,他没有回答自己。你刚才不是回答了你自己吗?它是未指定的。@ninjalj:根据同样的推理,我可以说,由于地址0处的值未在标准中定义,
*0
产生实现定义的行为。@ninjalj:他没有问它是否未指定。他问它是未定义的,还是实现定义的。所以不,他没有回答自己。
printf("%d%d", ++x, x);