好吧,我并不是真的很需要这个答案,我只是好奇。
像 *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/