1.
第一次看这题直接蒙圈了,什么玩意,指针也能相减?返回指针差值?
经过与学长的激烈讨论才拿下这个“家伙”。
int fun1(char *s){
char *p = s;
while(*p++);//先*p 赋值,后自增,++和*平级
return p-s;
}
int fun2(char *s){
char *p = s;
while(*++p);//先自增,后赋值,++和*平级
return p-s;
}
int main(void)
{
int a,b;
a = fun1("66666");
b = fun2("66666");
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
先看a,从主函数传入字符串“66666”,进入fun1(),s指向字符串的开头,将s赋给p,即p也存放的是字符串的首地址。下面就比较有趣了,先*p 赋值,后自增,
由于p++置后自增,所以先*p,是先执行++呢,还是先执行while(*p)呢?
经过试验,是先进行while(*p),之后才进行++运算。到了最后的时候,先将判断while(‘\0’); ‘\0’转换成int型是0,结束循环,p++,指向内存的下一空间,
如下图:
返回p-s,即地址的差值,因为数组内存中地址连续,显然p-s=6返回 6。
再看b,是先*p,还是++p呢?,经试验,先自增,再赋值,着会导致while();判断时,直接跳过首元素。。。。。。到最后while(‘\0’); 出循环,
如下图:
返回p-s,即5。
下面是Dev运行结果:
综上所述:++前缀比指针运算符优先极高,++后缀和指针优先级平级
2.
int main(void)
{
printf("\0109");
printf("\0126");
return 0;
}
转义字符,默认八进制,只能取前三位,010,八进制转换成二进制后是8,查AscII表,为 BS(退格),由于前方无格可退,所以,不退了,直接输出9。
012,查AscII表 OC(换页),相当于回车,所以回车后输出6。