C语言--每日五道选择题--Day1

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C语言--每日五道选择题--Day1

1.第一题

1、指出下列代码的缺陷( )【多选】

float f[10];
// 假设这里有对f进行初始化的代码
for(int i = 0; i < 10;)
{
    if(f[++i] == 0)
    break;
}

A: for(int i = 0; i < 10;)这一行写错了

 

B: f是float型数据直接做相等判断有风险

 

C: f[++i]应该是f[i++]

 

D: 没有缺陷

答案及解析

答案:BC


A选项错误,因为我们i值的更新在内部



B选项正确,一般float型只能精确到小数后六位(即1e-6),所以我们应该将float型数据的绝对值与1e-6比较,来判断是否为零



       float的精度误差在1e-6;double精度误差在1e-15;所以要判断一个float型数:if(fabs(f)<1e-6);要判断一个double型数:if(fabs(f)<1e-15);若满足,则为零。


C选项正确,我们的数组越界了。



D选项错误,代码有缺陷。

第二题

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

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

答案及解析

答案:AC


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


第2处:在语句GetMemory(&str,80);中传入str的地址,在语句char*str=NULL;中str初始化为空指针,但是str指针变量也有地址,所以参数char**p里面的p保存的是指针变量str的地址,所以调用GetMemory函数之后,动态开辟的空间的地址存放在了str中,在函数返回之后没有释放内存,但是这不会导致程序错误,只会导致内存泄漏。


第3处:用&str是错的,应该直接用str,是刚申请下来的空间首地址,可以用来接收字符串的copy。


第4处:printf可以直接打印字符串;

第三题

3、请问下列代码的输出结果有可能是哪些( )【多选】

#include <stdio.h>
typedef union
{
    int a;
    struct
    {
        short b;
        short c;
    };
}X;
int main()
{
    X x;
    x.a = 0x20150810;
    printf("%x,%x\n", x.b, x.c);
    return 0;
}


A: 2015,810

B: 50810,201

C: 810,2015

D: 20150,810

答案及解析

答案AC


对于0x20150810


如果按照大端模式存储:


从低地址到高地址:20 15 08 10 输出从低地址到高地址:20 15 08 10


如果按照小端模式存储:


从低地址到高地址:10 08 15 20 输出从高地址到低地址:08 10 20 15


此数以int类型赋值给联合体x.a,而以结构成员b和c分开访问,


分别拿到低地址的2个字节和高地址的2个字节


大端下是2015和810,小端下是810和2015

第四题

4、下面这个程序执行后会有什么错误或者效果( )【多选】

#define MAX 255
int main()
{
    unsigned char A[MAX], i;
    for(i = 0; i <= MAX; i++)
        A[i] = i;
    return 0;
}

A: 数组越界  B: 死循环  C: 栈溢出    D: 内存泄露

答案及解析

答案:AB

数组下标越界:数组大小255,但是当a[255]就是256个元素,导致越界了。


死循环:这个是因为无符号字符型的变量大小在0-255之间,所以说i永远不可能大于255的,是个死循环。


内存泄漏:创建的临时变量,在栈中会由系统自动释放,所以是不存在内存泄漏的问题。


栈溢出:属于缓冲区溢出的一种。栈溢出是由于C语言系列没有内置检查机制来确保复制到


缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围

第五题

5、请问下列程序的输出是多少( )

#include<stdio.h>
int main()
{
    unsigned char i = 7;
    int j = 0;
    for(;i > 0;i -= 3)
    {
        ++j;
    }
    printf("%d\n", j);
    return 0;
}

B: 死循环

C: 173

D: 172


答案及解析

答案:C

本题就是找规律,计算什么时候能遇到0


unsigned char 8位数据位,范围在0-255,所以-2时,变成254;同理-1时,变成255;最后减到0时,不满足循环条件,for停止。刚好173次。


7 4 1 ==> 共(7-1)/3+1=3次(1-3=-2,即254,继续循环)


254 251 ... 5 2 ==> 共(254-2)/3+1=85次(2-3=-1,即255,继续循环)


255 252 ... 6 3 ==> 共(255-5)/3+1=85次(3-3=0,退出循环) 所以总共173次

相关文章
|
2月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
34 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
2月前
|
算法 C语言 C++
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(中)
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
113 1
|
2月前
|
算法 编译器 C语言
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(上)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
30 3
|
2月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(中)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
29 1
|
2月前
|
存储 编译器 C语言
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(下)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
29 0
|
2月前
|
Java 编译器 定位技术
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(中)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
27 0
|
2月前
|
安全 程序员 C语言
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(上)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
26 0
|
2月前
|
存储 算法 C语言
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(下)
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
23 0
|
2月前
|
存储 C语言 C++
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(上)
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
23 0
|
2月前
|
C语言 C++
从C语言到C++⑧(第二章_类和对象_下篇_续)笔试选择题和OJ题
从C语言到C++⑧(第二章_类和对象_下篇_续)笔试选择题和OJ题
25 0