C语言有趣面试题

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。

扫描二维码关注公众号,回复: 11202115 查看本文章

这里写图片描述

综上所述:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

原创文章 42 获赞 32 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39671159/article/details/79778993
今日推荐