C/C++自增运算符“++”分析
// test_plus_plus.cpp : test ++ operator
#include "stdafx.h"
#include <malloc.h>
int _tmain(int argc, _TCHAR* argv[])
{
/****************************** 《++运算符》 ******************************/
/* int c;
int a = 1;
int b = 5;
int *p;
printf("++a=%d\n",++a); // a=a+1=2, 输出++a=2
printf("a=%d\n",a); // a=2
printf("a++=%d\n",a++); // 输出a++=2, a=a+1=3;
printf("a=%d\n",a); // a=3
printf("(++a)++=%d\n",(++a)++); // (++a)=>a=4, (a=4)++输出a=4, a=a+1=5;
printf("a=%d\n",a); // a=5;
// printf("++(a++)=%d\n",++(a++)); // error:(a++)不能做左值
// printf("(a++)++=%d\n",(a++)++); // error:(a++)不能做左值
printf("++(++a)=%d\n",++(++a)); // (++a)=>a=a+1=6, ++(a=6)=>a=7 输出a=7
printf("a=%d\n",a); // a=7
getchar();
*/
/************************************************************************/
/*****************《 ++运算符与(*运算符/指针)结合 》*************************/
/*
int c;
int a = 1;
int b[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int *p;
p = b;
printf("p=%d\n", p); // p=&b[0]=addr;
printf("*p=%d\n", *p); // *p=b[0]=1;
printf("p++=%d\n", p++); // p=&b[0], 输出addr, 然后p=p+1=addr+4
printf("p=%d\n", p); // p=&b[1]=addr+4;
printf("*p=%d\n", *p); // *p=b[1]=2;
printf("++p=%d\n", ++p); // p=&b[2],输出addr+8;
printf("p=%d\n", p); // p=addr+8;
printf("*p=%d\n", *p); // *p=b[2]=3;
printf("*p++=%d\n", *p++); // 自右向左结合*p++,先用p,所以输出*p=b[2], 然后p=p+1而不是*p=*p+1,即p=&b[3]=addr+12
printf("b[2]=%d\n", b[2]); // b[2]=3;
printf("p=%d\n", p); // p=&b[3]=addr+12;
printf("*p=%d\n", *p); // *p=b[3]=4;
printf("*(p++)=%d\n", *(p++)); //输出*p=b[3]=4, 然后p=p+1=&b[4]
printf("p=%d\n", p); // p=&b[4]=addr+16;
printf("*p=%d\n", *p); // *p=b[4]=5;
printf("*++p=%d\n", *++p); // p=p+1=&b[5]=addr+20,输出*(addr+20)=b[5]=6
printf("p=%d\n", p); // p=&b[5]=addr+20;
printf("*p=%d\n", *p); // *p=b[5]=6;
printf("*(++p)=%d\n", *(++p)); // p=p+1=&b[6]=addr+24,输出*(addr+24)=b[6]=7;
printf("p=%d\n", p); // p=&b[6]=addr+24;
printf("*p=%d\n", *p); // *p=b[6]=7;
// 下面这一段特别容易出错
//printf("(p++)++=%d\n",(p++)++); // error C2105: '++' needs l-value
printf("(++p)++=%d\n",(++p)++); // p=p+1=&b[7]=addr+28,然后输出addr+28,然后p=p+1=&b[8]=addr+32
printf("p=%d\n", p); // p=&b[8]=addr+32;
printf("*p=%d\n", *p); // *p=b[8]=9;
printf("(*p++)++=%d\n",(*p++)++); // (*p++)++ <==> (i=*p,p=p+1)++,(i=*p,p=p+1)先返回i=*p,然后p=p+1
// 此时p=&b[9],i=*p=b[8];
// 最后执行 (i)++,即*p=*p+1=>b[8]=b[8]+1=9+1=10;
printf("b[8]=%d\n",b[8]);
printf("p=%d\n", p); // p=&b[9]=addr+36
printf("*p=%d\n", *p); // *p=b[9]=10;
printf("(*++p)++=%d\n",(*++p)++); // (*++p)++ <==> i=(*++p), i++ <==> i=(p=p+1, *p),i++
// 即p=&b[10],i=*p=b[10],i++ ==>输出i=*p=b[10]=11,最后*p=*p+1即b[10]=b[10]+1=12;
printf("b[10]=%d\n",b[10]);
printf("p=%d\n", p); // p=&b[10]=addr+40
printf("*p=%d\n", *p); // *p=b[10]=12
printf("*++(++p)=%d\n",*++(++p)); // *++(++p) <==> i=++p,*++i <==> p=p+1,i=p,*++i <==>
// p=p+1,i=p, p=i=i+1,*p=*i 所以 p=&b[11]=addr+44, p=i=&b[12]=addr+48,*p=*i=b[12]输出*p=*i=b[12]=13
printf("p=%d\n", p); // p=&b[12]=addr+48
printf("*p=%d\n", *p); // *p=b[12]=13
// 上面这一段特特容易出错
printf("(*p)++=%d\n",(*p)++); // *p = *p+1 输出*p=b[12]=13,然后b[12]=b[12]+1=14;
// *p++ :先对指针p解引用,就是求*p,然后对指针自增,即p++; <==> i=*p,p=p+1,返回i
// (*p)++ :先求*p,然后将括号里的当成一个整体,即*p,对*p自增;<==> i=*p, i=i+1,返回i
printf("b[12]=%d\n",b[12]);
printf("++(*p)=%d\n",++(*p)); // *p = *p+1 输出*p=b[12]=15
printf("b[12]=%d\n",b[12]);
//printf("*p++++=%d\n",*p++++); // error C2105: '++' needs l-value
//printf("*++p++=%d\n",*++p++); // error C2105: '++' needs l-value
//printf("(*++)++p=%d\n",(*++)++p); // error C2059: syntax error : ')'
getchar();
*/
/************************************************************************/
/******************《 ++运算符与(*运算符,指针,结构体)结合 》**************/
char a[]="WhatIsTheResult";
struct test{
int len;
char *str;
}*p;
p=(struct test*)malloc(sizeof(struct test ));
(*p).len=5;
(*p).str=&a[0];
int SIZE=sizeof(struct test);
printf("SIZE = %d\n", SIZE);
printf("p=%d\n", p);
printf("a=%d\n", a);
printf("str = %d\n", (*p).str);
printf("++p->len = %d\n", ++p->len); // 增加len的值
printf("(*p).len = %d\n", (*p).len);
printf("*p->str = %c\n", *p->str); // 输出a[0]
printf("*p->str++ = %c\n", *p->str++); // *(p-str)++输出a[0],然后str指向a[1]
printf("str =%d\n", (*p).str);
printf("(*p->str)++ = %c\n", (*p->str)++); // 输出a[1],然后a[1]=a[1]+1
printf("a[1]=%c\n", a[1]);
printf("*p++->str = %c\n", *p++->str); // 输出a[1],然后p=p+1指向下一个结构体,即p=p+sizeof(struct test);
printf("p=%d\n", p);
getchar();
/************************************************************************/
}