#include "stdafx.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char *s=new char[10];
char *c="510203040";
memcpy(s,c,strlen(c));
std::cout<<*s++<<" ";
std::cout<<*s<<endl;
memcpy(s,c,strlen(c));
cout<<*(s++)<<" ";
std::cout<<*s<<endl;
memcpy(s,c,strlen(c));
cout<<(*s)++<<" ";
std::cout<<*s<<endl;
memcpy(s,c,strlen(c));
cout<<((*s)++)<<" ";
std::cout<<*s<<endl;
memcpy(s,c,strlen(c));
cout<<*++s<<" ";
std::cout<<*s<<endl;
memcpy(s,c,strlen(c));
cout<<++*s<<" ";
std::cout<<*s<<endl;
system("pause");
return 0;
}
输出为
5 1
5 1
5 6
5 6
1 1
6 6
情况1=情况2:运算符优先级++大于*,先对指针自增,然后解引用,因为是后置递增运算,所以先输出指针自增前所指的值5,第二次输出是当前指针所指的值1;
情况3=情况4:先对指针解引用,再对指针内容做自增运算,因为是后置递增运算,所以先输出自增前的值,第二次输出当前值;
情况5:因为++紧邻s,所以先对指针进行前置递增运算,然后解引用,因为是前置递增,所以两次输出的都是当前值;
情况6:因为*紧邻s,所以先对指针解引用,然后对指针内容自增运算,因为是前置递增,所以两次输出都是当前值
情况 | 自增对象 | 自增(前置or后置) |
---|---|---|
*s++ | 指针 | 后置自增 |
*(s++) | 指针 | 后置自增 |
(*s)++ | 指针内容 | 后置自增 |
((*s)++) | 指针内容 | 后置自增 |
*++s | 指针 | 前置自增 |
++*s | 指针内容 | 前置自增 |
前置自增是先将运算对象加1,然后将改变后的对象作为求值结果
后置自增是先将运算对象加1,但是求值结果是运算对象改变之前那个值得副本
综上:++优先级大于*