这个问题其实是论述*P++等价于(*p)++还是等价于*(p++)的问题,为了验证这个问题,我编写了下面的小程序(vc++6.0编译环境),作为验证
程序1
#include "stdio.h"
void main()
{
int a=2 ;
int *p=& a;
int *pold;//记录P指向的地址,为了作为比较使用
pold= p;
//-----------原来的信息
printf("原来的a=%d " ,a);
printf("原来的p=%x " ,p);
printf("原来的pold=%x " ,pold);
//----------进行变化
printf("*p++的结果=%d,a的结果a=%d ",*p++ ,a);
printf("地址变化的结果p-pold=%x ",p- pold);
}
void main()
{
int a=2 ;
int *p=& a;
int *pold;//记录P指向的地址,为了作为比较使用
pold= p;
//-----------原来的信息
printf("原来的a=%d " ,a);
printf("原来的p=%x " ,p);
printf("原来的pold=%x " ,pold);
//----------进行变化
printf("*p++的结果=%d,a的结果a=%d ",*p++ ,a);
printf("地址变化的结果p-pold=%x ",p- pold);
}
运行结果是:
程序2
#include "stdio.h"
void main()
{
int a=2;
int *p=&a;
int *pold; // 记录P指向的地址,为了作为比较使用
pold=p;
// -----------原来的信息
printf("原来的a=%d ",a);
printf("原来的p=%x ",p);
printf("原来的pold=%x ",pold);
// ----------进行变化
printf("(*p)++的结果=%d,a的结果a=%d ",(*p)++,a);
printf("a的结果a=%d ",a);
printf("地址变化的结果p-pold=%x ",p-pold);
}
void main()
{
int a=2;
int *p=&a;
int *pold; // 记录P指向的地址,为了作为比较使用
pold=p;
// -----------原来的信息
printf("原来的a=%d ",a);
printf("原来的p=%x ",p);
printf("原来的pold=%x ",pold);
// ----------进行变化
printf("(*p)++的结果=%d,a的结果a=%d ",(*p)++,a);
printf("a的结果a=%d ",a);
printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果
程序3
#include "stdio.h"
void main()
{
int a=2;
int *p=&a;
int *pold; // 记录P指向的地址,为了作为比较使用
pold=p;
// -----------原来的信息
printf("原来的a=%d ",a);
printf("原来的p=%x ",p);
printf("原来的pold=%x ",pold);
// ----------进行变化
printf("a=%d,(*p)++的结果=%d,a的结果a=%d ",a,(*p)++,a);
printf("a的结果a=%d ",a);
printf("地址变化的结果p-pold=%x ",p-pold);
}
void main()
{
int a=2;
int *p=&a;
int *pold; // 记录P指向的地址,为了作为比较使用
pold=p;
// -----------原来的信息
printf("原来的a=%d ",a);
printf("原来的p=%x ",p);
printf("原来的pold=%x ",pold);
// ----------进行变化
printf("a=%d,(*p)++的结果=%d,a的结果a=%d ",a,(*p)++,a);
printf("a的结果a=%d ",a);
printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果:
程序4
#include "stdio.h"
void main()
{
int a=2;
int *p=&a;
int *pold; // 记录P指向的地址,为了作为比较使用
pold=p;
// -----------原来的信息
printf("原来的a=%d ",a);
printf("原来的p=%x ",p);
printf("原来的pold=%x ",pold);
// ----------进行变化
printf("*(p++)的结果=%d,a的结果a=%d ",*(p++),a);
printf("a的结果a=%d ",a);
printf("地址变化的结果p-pold=%x ",p-pold);
}
void main()
{
int a=2;
int *p=&a;
int *pold; // 记录P指向的地址,为了作为比较使用
pold=p;
// -----------原来的信息
printf("原来的a=%d ",a);
printf("原来的p=%x ",p);
printf("原来的pold=%x ",pold);
// ----------进行变化
printf("*(p++)的结果=%d,a的结果a=%d ",*(p++),a);
printf("a的结果a=%d ",a);
printf("地址变化的结果p-pold=%x ",p-pold);
}
运行结果:
程序5
#include "stdio.h"
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d ",*p++,(*p)++,*q++);
printf("%d ",a);
}
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d ",*p++,(*p)++,*q++);
printf("%d ",a);
}
运行结果:
程序6
#include "stdio.h"
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d ",(*p)++,*p++,*q++);
printf("%d ",a);
}
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d ",(*p)++,*p++,*q++);
printf("%d ",a);
}
运行结果:
程序7:
#include "stdio.h"
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d %d ",(*p)++,*p++,*q++,a);
printf("%d ",a);
}
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d %d ",(*p)++,*p++,*q++,a);
printf("%d ",a);
}
运行结果:
程序8:
#include "stdio.h"
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d ",*p++,(*p)++,*q++);
p=&a;q=&a;
printf("%d %d %d %d ",a,*p,(*q)++,a);
printf("%d %d %d %d ",a,++(*p),++(*q),a);
printf("%d ",a);
}
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d ",(*p),a);
printf("%d %d %d ",*p++,(*p)++,*q++);
p=&a;q=&a;
printf("%d %d %d %d ",a,*p,(*q)++,a);
printf("%d %d %d %d ",a,++(*p),++(*q),a);
printf("%d ",a);
}
运行结果:
综上所述:
*p++是先取出*p的值,然后让p++
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
而且printf的运行顺序是从右向左运行。而且右++是在整个运算表达式运算完才进行,而且右++的执行顺序是从左到右进行。而左++遇到变量就会立即增加变量的值。
验证printf的运算顺序
#include "stdio.h"
void main()
{
int a=2;
printf("a++=%d,++a=%d,a++=%d ",a++,++a,a++);
printf("a=%d ",a);
}
void main()
{
int a=2;
printf("a++=%d,++a=%d,a++=%d ",a++,++a,a++);
printf("a=%d ",a);
}
运行结果:
剩下的工作就是你自己慢慢体会了。
以前学的时候弄的很清楚,可是现在发现又忘了,腾讯的笔试考了几道这样的题型,让我回来好好的在电脑测试整理整理了一下
发现以下结果:
*p++是先取出*p的值,然后让p++
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
{
}
2 2 3 2 2 3
4 4 3 4 6 6 6 6 6
而且printf的运行顺序是从右向左运行。而且右++的执行顺序是从左到右进行。而左++遇到变量就会立即增加变量的值。
验证printf的运算顺序
#include "stdio.h"
void main()
{
int a=2;
printf("a++=%d,++a=%d,a++=%d ",a++,++a,a++);
printf("a=%d ",a);
}
void
{
}
运行结果:
a++=4,++a=5,a++=2 a=5
#include <iostream>
#define f(x) x*x
#define f(x) x*x
void main()
{
int a=2;
cout<<f(a++);
cout<<f(++a);}
{
运行结果: 4 36
*p++等价于*(P++)一样
*p++;
1.* 和 ++都是单目运算符,处于同一优先级;
2.这两个运算符的结合性是自右至左;
so,p先与++结合~ 你需要理解操作副的优先级 *的优先级比++一样,因此 *p++和*(p++)的结果是将首先使用P指针指向的数据,然后P+1
#include<stdio.h> int main( ) { int a[10]={0,1,2,3,4,5,6,7}; int *p=a; printf("%d ,%d ,%d\n",*p++,(*p)++,*(p++)); //0 0 0 2 //printf("%d\n",*p++); //0 1 *(解应用)与++ 同级别 但从右向左结合,所以先取出*p该值,然后p++ 后自增 所以先引用再自增的 所以先输出*p 再p++ // printf("%d\n",(*p)++);//0 1执行取值操作对该值进行加加 先应用后自增 所以先输出了 // printf("%d\n",++(*p));// 1 1先加加再引用输出改值 // printf("%d\n",*(p++));//0 1 // // printf("%d\n",* ++p);//1 1先p++ 再引用 // printf("%d\n",++*p);//1 1先*取值再值++从右向左优先级 // printf("%d\n",++(*p));//1 1先 printf("%d\n",*p); return 0; }//以上的结果,在执行的时候。除了最后一句是共有的其余的各句都是单一执行,互斥的例如 //下面例子可能有部分错误 int a[5]={1,2,3,4,5}; int *p = a; *p++ 先取指针p指向的值(数组第一个元素1),再将指针p自增1; cout << *p++; // 结果为 1 cout <<(*p++); // 1 (*p)++ 先去指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2 cout << (*p)++; // 1 cout <<((*p)++) //2 *++p 先将指针p自增1(此时指向数组第二个元素),* 操作再取出该值 cout << *++p; // 2 cout <<(*++p) //2 ++*p 先取指针p指向的值(数组第一个元素1),再将该值自增1(数组第一个元素变为2) cout <<++*p; // 2 cout <<(++*p) //2 注意,上面的每条cout输出,要单独输出才能得到后面的结果。*p++和*(p++)是一样的,先*p然后再p++,因为后面的++要遇到;(分号)才执行 ,所以p++在最后执行,并不是在括号里面执行。++*p说反了, cout<<*p++;输出的是p所指变量空间自增之前的值,而*p++;cout<<*p;是先将p所指变量空间自增,再输出其所指变量空间的值。http://zhidao.baidu.com/link?url=cPqvf7lUrwbPCFfZ_B-uRr47-CuYIfGknVitrh-qwfzKRpIKGDemPM2NChuT4bIADgIsmuvK3LFV7GEyK-NZR_
http://blog.csdn.net/niuyongjie/article/details/2490869
http://blog.sina.com.cn/s/blog_67b081c50100i34o.html
http://www.cjjjs.com/paper/bcyy/20167513311193.aspx