C语言刷题笔记 day007 2021.8.27

1.在某个类A中存在一个方法:void set(int x),以下不能作为这个方法的重载的声明的是

  • void set(int y)
  • int set(int x,double y)
  • double set(int x,int y)
  • void set(int x,int y)

解析:

方法重载:方法名称相同,参数列表不同(可以是参数的类型,个数,顺序不同)

注意:如果两个方法只有返回值类型不同,编译器看还是同一个方法。

2.下面的函数原型声明中存在语法错误的是

  • AA(int a, int b)
  • AA(int, int)
  • AA(int a; int b;)
  • AA(int a, int)

解析:

如果被调用函数(自定义函数)在主调函数的后面,则需要提前声明函数。

声明的作用是把函数名,参数类型和个数等通知给编译系统,以便编译系统正确识别并检查函数调用是否合法。

而函数就是通过函数原型进行声明,函数原型包含检查函数是否合法的基本信息

函数原型与函数的首行相同,其中形参名可以省略,只写类型。

3.在标准C中,while和do_while的功能完全相同。请问这句话的说法是正确的吗?

解析:错误

while先判断在执行,do.while先执行在判断,这样机制一般会导致后者多执行一次

4.下列变量说明语句中,正确的是

  • char:a b c;
  • char a;b;c;
  • int x;z;
  • int x,z;、

5.函数调用不可以

  • 出现在执行语句中
  • 出现在表达式中
  • 作为一个函数的实参
  • 作为一个函数的形参

解析:

在这里插入图片描述

6.对于条件表达式(k)?(i++):(i–)来说,其中的表达式k等价于

  • k==0
  • k==1
  • k!=0
  • k!=1

解析:

条件表达式

逻辑表达式?表达式1:表达式2

逻辑表达式的值非零则条件表达式的值为表达式1,反之为表达式2

也就是==0为假,!=0为真

void main(void) {
    char *s = "1314520";
    int v1 = 0, v2 = 0, v3 = 0, v4 =0;
    for (int i = 0; s[i]; i++) {
        switch(s[i]) {
            default: v4++;
            case '1': v1++;
            case '2': v2++;
            cas3 '3': v3++;
        }
    }
    printf("%d, %d, %d, %d", v4,v1,v2,v3)
}

输出:

解析:

3,5,6,7

default顾名思义是缺省情况,只有任何条件都不匹配的情况下才会执行,故会匹配到s[i]为‘4’,‘5’,‘0’ 的情况。于是v4++三次,v4=3.并且这个default后没有使用break语句,于是case‘1’、‘2’、‘3’都会执行三次。注意到所以语句都没有加break,则语句执行过之后会继续下面的case语句,另外由于s[i]中有两个1,故v1,v2,v3此时为5.另外有一个2,v2,v3++后为6,还有一个case3 于是v3++.最终v3为7.

8.以下叙述中正确的是

  • 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
  • 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
  • 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;
  • 指针变量之间不能用关系运算符进行比较

解析:

指针变量只能赋予地址,不能赋予其他且必须与指向对象的基类型相同。

指针变量之间进行关系运算可比较他们所指元素的关系。

空指针不指向任何类型的数据。

9.假设已经有定义“ const char*name=" chen " ;”,下面的语句中错误的是

  • name[3]=‘q’;
  • name=“lin”;
  • name=new char[3];
  • name=new char(‘q’);

解析:

指针变量引用字符串实际是把第一个字符的地址赋给了指针变量,而字符串是存储在一个无名的字符数组中。

10.下列关于bool,int,float,指针类型的变量a 与“零”的比较语句正确的有?

  • bool : if(!a)
  • int : if(a == 0)
  • float: if(a == 0.0)
  • 指针: if(a == nullptr)

解析:

由于计算机二进制表示浮点数有精度的问题,0.0(浮点double)实际上不是0,而是非常接近零的小数,所以C错!
在ANSIC C中定义了FLT_EPSILON/DBL_EPSILON/LDBL_EPSILON来用于浮点数与零的比较,一般if(fabs(a)<FLT_EPSILON)或if(fabs(a)< DBL_EPSILON)就可以表示a是否“为0”。而if(a==0.0)是永远不会成立的,达不到要求!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值