为什么下面有区别?
program001.c:
int main (void)
{
int a=3,*p,x;
p=&a;
*p++;
x=*p
printf("a=%d, *p=%d, x=%d\n",a, *p, x);
return 0;
}
result: a=3,*p=21974,x=21974
Program002.c:
int main (void)
{
int a=3,*p,x;
p=&a;
x=*p++;
printf("a=%d,*p=%d,x=%d\n",a,*p,x);
return 0;
}
result:a=3,*p=3,x=3
对于program001的结果,可以理解:* p ++指向未定义的值,因此这是不合理的结果。
对于program002&#39>的结果,为什么它不等于program001?
答案 0 :(得分:4)
从示例1开始:
df = df.astype(float)
可以改写为
*p++;
x=*p;
从示例2开始:
*p; // dereference p and ignore the value. Valid as p points to a
p++; // increment p
x=*p; // dereference p and assign the value to x. Invalid as p no longer
// points to an int object
可以改写为
x = *p++;
因此,在示例1中,在 p递增后分配给x 。在示例2中,您在 p递增之前分配给x 。
两个示例都有未定义的行为,例如:由于x = *p; // dereference p and assign the value to x. Valid as p points to a
p++; // increment p
在打印语句中*p
被取消引用,即使它不再指向p
对象,因为int
已递增。在示例1中,未定义的行为已经发生在p
答案 1 :(得分:0)
从两个程序的行为来看,没有区别。两个程序在所有控制路径上都有未定义的行为。所以这两个程序都可以崩溃,可以停止,可以无限运行,可以打印任何东西或者根本不打印任何东西。