• C语言经典笔试题目


    1.bool,float,指针变量 与 “零值” 比较的if语句

    注意点:c语言中bool类型采用整数存储,0为false,非0均为true; float类型采用IEEE754标准,第一位符号位,中间8位阶数,最后23位为尾数(1.尾数),有精度问题。

    bool flag 与零值比较:

      标准答案:if(flag)  if(!flag) ;

      不良风格:if(flag == TRUE)  if(flag ==1 )  if(flag == FALSE)  if(flag == 0)

    float f 与零值比较:

      标准答案:

      if( f < -0.000001 && f > 0.000001) //  !=0 

      if( f > -0.000001 && f < 0.000001)//    =0

      错误写法:

      if( f = 0 )

      if( f = 0.0)

    指针变量与零值比较:if(p == NULL)  if(p != NULL)

    2.数组int c[3][3]; 为什么c ,*c的值相等, (c+1), (*c+1)的值不等,c,*c,**c代表什么意思?

    c是第一个元素的地址,*c是第一行元素的首地址,其实第一行元素的地址就是第一个元素的地址,**c是第一行一个元素。为什么c,*c的值相等?c:数组名;是一个二维指针,他的值就是数组的首地址,即第一行元素的首地址(等于*c),也等于第一行第一个元素的地址(&c[0][0]);可以说成是二维数组的行指针。

    *c: 第一行元素的首地址;是一个一维指针,可以说成是二维数组的列指针。

    **c:二维数组中的第一个元素的值;即:c[0][0]

    所以:c和*c的值是相等的,但他们两者不能相互赋值(类型不同)

    3.float a,b,c,问:等式(a+b)+c==(b+a)+c  和 (a+b)+c==(a+c)+b能否成立?

    两者都不行。在比较float和double时,不能简单的比较。由于计算误差,相等的概率很低。应判断两数之间是否落在区间(-e,e)内。这个e应比浮点数的精度大一个数量级。

    4.处理器标识#error的目的是什么?

    主要考点:预处理指令。(预处理→编译→汇编→链接)

    预处理指令在预处理阶段全部被替换,不带分号

    参考答案:编译时输出一条错误信息,并中止继续编译。一般情况下和#if 一起使用

    5.语句for( ; 1 ; )有什么问题?它是什么意思?

    无限循环,等价于for(; ;) , while(1)

    6.strcpy()和memcpy()的区别

    字符串和内存的操作函数,都在string.h中,strcpy()在遇到''就停止copy(包含''),而memcpy()必须指定copy多少字节。

    7.do...while 和 while...有什么区别?

    前者至少执行一次,后者可能一次都不执行(直到型循环和当型循环)

    8.怎样用C编写死循环

    for(;;) while(1)

    9.用变量a给出下面的定义

    ①一个有10个指针的数组,该指针是指向一个整型数的  // int* a[10]

    ②一个指向有10个整形数组的指针 // int (*a)[10]

    ③一个指向函数的指针,该函数有一个整形参数并返回整型值 // int (*a)(int)

    ④一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整形值 // int (*a[10])(int)

    10.请问以下代码有什么问题:

    1 char* s = "AAA";
    2 printf("%s",s);
    3 s[0]='B';
    4 printf("%s",s);

    考点:字符串常量问题。C语言中双引号部门内容称为字符串常量,其值不允许被更改。本题中,s指向了AAA,用s[0]试图更改常量值会出错。

    若用char s[] = "AAA",再利用s[0]='B'更改则不会报错

    11.C和C++中struct有什么不同

    c中的struct不可以含有成员函数,而c++中的struct可以;C++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private

    12.const 与 #define的比较 ,const有什么优点?

    const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能产生意料不到的错误(边际效应)。

    有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试、

    13.引用和指针的区别。

    ①引用被创建的同时必须被初始化,指针则可在任何时候被初始化

    ②不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)

    ③一旦引用被初始化,就不能改变引用关系,指针则可以随时改变所指对象。

    14.以下代码有什么问题?

    void getmemory(char* p){
      p = (char*)malloc(100);
      strcpy(p,"hello world");        
    }
    int main(){
        char* str = NULL;
        getmemory(str);
        printf("%s
    ",str);
        free(str);
        return 0;
    }

    程序崩溃!getmemory中的malloc不能返回动态内存,free()对str操作很危险

    15.以下代码产生什么结果?为什么?

    char szstr[10];
    strcpy(szstr,"123456789");

    长度不一样 出现段错误,操作了不属于自己的空间

    引申考点:"0123456789ABCDEF"[i] 这种写法也可以,得到指向第一个元素的地址值 

    16.数组和链表的区别

    数组:数据顺序存储,固定大小;链表:数据可以随机存储,大小可动态改变

    17.以下代码会出现什么问题?打印结果是多少?

    void main(){
        char aa[10];
        printf("%d",strlen(aa));
    }//输出结果在不同编译器下结果会不一样

    sizeof()返回值和是否初始化无关,但strlen()返回值与是否初始化有关,打印结果未知。

    18.给定结构struct A,问sizeof(A)=?

    struct A{
        char t:4;
        char k:4;
        unsigned short i:8;
        unsigned long m;
    };

    答案 : 8 (考虑字节对齐)

    19.给定结构struct name1,问sizeof(name1)=?

    struct name1{
        char str;
        short x;
        int num;
    };

    答案:8

    20.int a,b,c 请写函数实现c = a+b,不可以改变数据类型,如将c改为long int,判断是否溢出?

    bool add(int a,int b,int* c){
        *c = a+b;
        return (a>0 && b>0 && (*c < a || *c < b) || (a<0 && b<0 && (*c > a) || *c >b)));
    }
  • 相关阅读:
    获取从链接传来的id
    通过域名直接访问Tomcat项目解决方法
    线程与高并发
    阿里云部署javaWeb项目全过程
    前后端分离项目,支持跨域,session不丢失
    python函数
    装饰器
    迭代器和生成器
    C/C++ I/O处理
    C++虚函数
  • 原文地址:https://www.cnblogs.com/shengtudai/p/12879714.html
Copyright © 2020-2023  润新知