在*C++ 03中,`* - p`实际上是合法的(格式良好)

Pra*_*rav 13 c++ undefined-behavior language-lawyer c++03

我想知道这段代码:

int main()
{
   char *p ;
   char arr[100] = "Hello";
   if ((p=arr)[0] == 'H') // do stuffs
}
Run Code Online (Sandbox Code Playgroud)

这段代码实际上是在C++ 03中很好地形成的吗?

我的论点是,副作用=仅在下一个序列点之后完成,并且由于我们访问p=arr代码的结果可能不是很好,因此在=[]操作之间没有排序.

我对么?

行为在C和C++ 11中得到了很好的定义.此代码实际上源自MySQL.

Ben*_*igt 25

当然它的定义很明确.

任务何时进行并不重要p=arr.你没有评估p[0],你正在订阅结果(p=arr),这是存储的指针值p.它是否已被存储但不会改变该值,并且无论是否p已经修改,该值都是已知的.

同样,在*--p,没有未定义的行为.如果在序列点之间访问相同的变量两次(包括至少一次写入),则只有未定义的行为.但p只能访问一次,作为其一部分--p.它不会再次读取(*p),解除引用运算符应用于其结果--p是明确定义的指针值.

现在,这将是未定义的行为:

void* a;
void* p = &a;
reinterpret_cast<void**>(p = &p)[0] = 0;
Run Code Online (Sandbox Code Playgroud)

就像那样

int *pi = new int[5];
int i = **&++pi;
Run Code Online (Sandbox Code Playgroud)

应该清楚的是,preincrement的结果不是与write无序的读取,因为断言有一个种族断言++p永远不能用作rvalue,在这种情况下它必须独立于序列点之间,可以改为使用后增量.在语言中同时使用预增量和后增量没有任何好处.

  • 对于任何未来的读者,请参阅这篇元文章:http://meta.stackexchange.com/questions/118996/where-did-all-the-comments-go-on-is-p-actually-legalwell-formed-in -c03 (2认同)
  • 另外,可以在此处找到已删除评论的笔录:http://i.stack.imgur.com/f4rIE.png (2认同)