我试图理解为什么我有这个输出。
a[0]: 5, a[1]: 5, ptr: 5
从这个小程序开始。
#include <stdio.h>
int main() {
int a[2] = {5, 10};
int *ptr = a;
*ptr = *(ptr++);
printf("a[0]: %d, a[1]: %d, ptr: %d\n", a[0], a[1], *ptr);
return 0;
}
我不理解的部分是。
*ptr = *(ptr++);
因为根据我的说法,应该发生的是ptr应该指向10,仅此而已,因为++ postfix应该在分配后增加ptr,所以根据我这应该将a [0]的值分配给[ 0](这不会影响任何东西)并且在这个ptr之后应该指向[1]上的10,但真正发生的是最后a [1]也是5,有人可以向我解释这个吗?
答案 0 :(得分:5)
您所看到的是未定义的行为。该语言不保证首先评估LHS还是首先评估RHS。平台可以选择首先评估哪一方。
在您的平台中,首先评估RHS。
RHS的值是5
。副作用是ptr
指向a[1]
。
然后,它被分配到*ptr
,即a[1]
。
<强>注意强> 由于编译器可以执行任何选择,因此在现实世界中强烈建议不要使用这种编程风格。请参阅http://en.wikipedia.org/wiki/Undefined_behavior。