x = * p ++和* p ++之间有什么区别; x = * p在c?

时间:2017-10-04 15:10:59

标签: c

为什么下面有区别?

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?

2 个答案:

答案 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)

从两个程序的行为来看,没有区别。两个程序在所有控制路径上都有未定义的行为。所以这两个程序都可以崩溃,可以停止,可以无限运行,可以打印任何东西或者根本不打印任何东西。