13

我想知道这段代码示例:

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

这段代码实际上在 C++03 中格式正确吗?

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

我对么?

该行为在 C 和 C++11 中得到了很好的定义。这段代码实际上是从 MySQL 派生的。

4

1 回答 1

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;

一样

int *pi = new int[5];
int i = **&++pi;

应该清楚的是,预增量的结果不是无序读取与写入,因为断言存在竞争就是断言++p永远不能用作右值,在这种情况下,它必须独立于序列点之间,并且可以使用后增量。在语言中同时使用前置增量和后置增量没有任何优势。

于 2012-01-13T03:41:47.297 回答