(C语言)笔试选择题的错题总结(答案+解析)_2

1、  求函数返回值,传入 -1 ,则在64位机器上函数返回( )

int func(int x)
{
    int count = 0;
    while (x)
    {
        count++;
        x = x&(x - 1);//与运算
    } 
    return count;
}

        A: 死循环 B: 64 C: 32 D: 16

        解析:
        x=x&(x-1)这个表达式执行一次就会将x的2进制中最右边的1去掉,在x变成0之前,表达

        式能执行几次,就去掉几个1,所以这个代码实现了求一个有符号整数二进制补码中1的

        个数的功能,我们知道-1的补码是全1,而int类型4个字节32位.

        正确答案:C

2、  请阅读以下程序,其运行结果是( )

int main()
{
    char c='A';
    if('0'<=c<='9') printf("YES");
    else printf("NO");
    return 0;
}

        A: YES B: NO C: YESNO D: 语句错误

        解析:
        '0'<=c<='9'并非判断x大于等于字符0,小于等于字符9,而是先执行'0'<=c,使用这个表达

        式的结果再和'9'比较,'0'的ASCII码值是48,'A'的ASCII码值是'65',故'0'<c是真值1,1

        无疑是小于字符'9'的,最终是真

        正确答案:B

3、   C语言中,下列运算符优先级最高的是 ( )
         A: ! B: % C: >> D: ==

        解析:
        单目运算符的优先级通常都比较高,具体情况可查阅运算符优先级表格

        正确答案:A

4、  如果 x=2014 ,下面函数的返回值是( )

int fun(unsigned int x)
{
    int n = 0;
    while(x + 1)
    {
        n++;
        x = x | (x + 1);
    }    
    return n;
}

        A: 20 B: 21 C: 23 D 25

        解析:
        这个作用是对整型中0的个数进行统计,x=x|(x+1);的作用是每次循环把x的二进制中从

        右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。2014的

        二进制是0000 0000 000 0000 0000 0111 1101 1110,所以结果是23

        正确答案:C

5、  有以下函数,该函数的功能是( )

int fun(char *s)
{
    char *t = s;
    while(*t++);
    return(t-s);
}

        A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数
        C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中

        解析:
        循环在*t为0时停止,同时t++,t最后会停在字符串结束的'\0'之后的一个位置,t作为尾

        部指针减去头部指针就是整个字符串占用内存的字节数,包含\0在内;而c答案字符串长

        度不包括最后的\0

        正确答案:B

6、  若有“ float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; ”,则 *pa 的值是( )
        A: 1.5 B: 2.5 C: 3.5 D: 4.5

        解析:
        在*pa=a中指针pa指向a[0];pa++返回值仍是操作之前的值;*(pa++)取pa指向的地址的

        值;*(pa++)*=3将该值变为原来的3倍,也就是数组a的第一个值为4.5;由于pa++之后

        pa指针移动了sizeof(float)个字节,所以pa指向a[1],所以值为2.5

        正确答案:B

7、  关于指针下列说法正确的是【多选】( )

        A: 任何指针都可以转化为void * B: void *可以转化为任何指针
        C: 指针的大小为8个字节 D: 指针虽然高效、灵活但可能不安全

        正确答案:ABC

8、  请指出以下程序的错误【多选】( )

void GetMemory(char **p, int num)
{
    if(NULL == p && num <= 0)//1
        return;
    *p = (char*)malloc(num);
        return;
} 
int main()
{
    char *str = NULL;
    GetMemory(&str, 80); //2
    if(NULL != str)
    {
        strcpy(&str, "hello"); //3
        printf(str); //4
    }
    return 0;
}

        A: 1 B: 2 C: 3 D: 4

        解析:
        第1处两种情况之一成立都是要返回的,应该用或,此处用与错误。在语句

        GetMemory(&str,100);中传入str的地址,在语句char*str=NULL;中str初始化为空指针,

        但是str指针变量也有地址,所以参数char**p里面的p保存的是指针变量str的地址,所以

        调用GetMemory函数之后,动态开辟的空间的地址存放在了str中,在函数返回之后没有

        释放内存,但是这不会导致程序错误,只会导致内存泄漏。第3处用&str是错的,应该直

        接用str,是刚申请下来的空间首地址,可以用来接收字符串的copy。

        正确答案:AC

9、  求以下代码的输出

int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;
    printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

        解析:


       两个指针相减得到的是中间的元素的个数,又因为两个地址是小-大,所以为负数,再以

       整数的形式打印,第二个值就是-4

       当以指针的形式打印,打印的就是-4的补码的十六进制表示形式,所以第一个值是fffffffc

猜你喜欢

转载自blog.csdn.net/m0_64051621/article/details/126772109