c++ - 这是 "*ptr++ = *ptr + a"未定义的行为吗?

标签 c++ c sequence-points

好吧,我并不是真的很需要这个答案,我只是好奇。

*ptr++ = a 这样的表达式是完全有效的,因为我们正在操作两个对象 ptr*ptr 但是如果我写 *ptr++ = *ptr + a 它仍然有效吗?

例如考虑以下片段:

int main(void){
   int a[] = {5,7,8,9,2};

   int* p =a;

   *p++ = 76; /*altering the first element */
   *p++ = *p + 32; /*altering the second element */    

   p = a;
   int i;
   for(i = 0;i<5; i++)
      printf("%d ",*p++);

   return 0;
}

我认为表达式 *p++ = *p + 32; 没有什么可担心的,但我不确定所涉及的序列点。

最佳答案

*ptr++ = *ptr + a 的结果未定义。等号不是序列点,因此在该语句中再次使用 ptr 的值会导致未定义的行为。只需考虑 ptr 在 RHS 表达式求值之前递增的结果,并将其与 ptr 在 RHS 表达式之后递增的情况进行比较.

注意:这并不是说表达式的结果将来自这两种情况中的任何一种。未定义是未定义的。

基本上,您只能指望两件事:在最后一个序列点和下一个序列点之间的某个时间计算后增量,并且表达式 ptr++ 返回 ptr 之前 它被递增。所以 *ptr++ = a 很好,因为您可以指望 ptr++ 的结果。

关于c++ - 这是 "*ptr++ = *ptr + a"未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1831316/

相关文章:

c++ - boost shared_ptr 和 c++ 引用。这里到底出了什么问题?

c++ - 指向结构的 std::vector 的指针

c - 为什么这些构造使用增量前和增量后未定义的行为?

c++ - 宏不通过直接调用扩展,而是通过间接调用扩展

多文件 C++ 链表

c++ - Android中的Jni层

c - 如何for循环迭代两个变量?

c - 如何向GPRS模块发送UDP数据包

c - 序列点和副作用 : Quiet change in C11?

c++ - 来自函数调用的序列点?