关于符号 有两点
首先 编译器的贪吃法规则,既尽量用更长的标志符
例如 a+++++b 会被理解成 a++ ++ +b 也就是((a++)++) + b,由于赋值表达式的左值一定是变量,所以会出错 a++ 是一个赋值表达式,(a++)++的左值是a++出错
第二 对于*P++的理解 *p++和 *(p++)是完全一样的
举个易错的例子
#include"iostream.h"
void main()
{
int a[]={1,3,5,7};
int *p;
p=a;
cout<<*p++<<endl; /*1 在这里输出*P为a[0]=1,并且将p指向下一个位置*/
p=a;
cout<<(*p)++<<endl; /*2 在这里输出*P为a[0]=1,并且将*p也就是a[0]作自增,a[0]=2*/
p=a;
cout<<*(p++)<<endl; /*3 同1,输出的a[0],这个时候a[0]=2了*/
}
所以上题的结果是1,1,2
从这里也能看出靠指针运算可以操作被指向的数,因为这里p就是a[0]的实际地址,p指向的值加1,则也就是a[0]加1,*p就是操作的a[0]
最重要的2点
1,任何一个逻辑运算符的优先级低于任何一个关系运算符。
2,移位运算符的优先级比算术运算符要低,但是要比关系运算符要高。
下面的例子除了*P++还用到了空指针 也就是指向NULL的指针 指针的值是0
#include <iostream>
#include <string>
using namespace std;
void print_char(char* array[]);//函数原形声明
void main(void)
{
char* test[]={"agfc","cde","fgh",NULL};//这里添加一个NULL,表示不指向任何地址,值为0
print_char(test);
cin.get();
}
void print_char(char* array[])
{
while(*array!=NULL)
{
cout<<*(array++)<<endl;
}
}