C语言.问题解(1~10)

#问题以本身不会的为主

1 以下不正确的定义语句是( )
A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0};
B: char c2[] = {'\x10', '\xa', '\8'};
C: char c1[] = {'1','2','3','4','5'};
D: int y[5+3]={0, 1, 3, 5, 7, 9};

答案解析:
正确答案:B
本题B选项考查转义字符,有如下格式,但八进制数字是0-7,没有8,故B选项中'\8'是错误的
\ddd  ddd表示1到3个八进制数  如:\130  转义为  字符X
\xhh  hh表示1到2位十六进制数  如:\x30  转义为  字符0

#0的十进制ascii码值为48,a的ASCII码数值是97,A的ASCII码数值是65。

2 test.c 文件中包括如下语句,  文件中定义的四个变量中,  是指针类型的变量为【多选】( )
#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d;
A: a B: b C: c D: d

答案解析:
正确答案:ACD
因为#define是宏定义,仅仅是直接替换,INT_PTR a, b; 进行宏替换后代码是这样的:int *a, b;这里的int *是a的类型,b的类型是int,故此次b只是int类型。而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。

3 有如下定义语句,则正确的输入语句是【多选】( )

int b;
char c[10];
A: scanf("%d%s",&b,&c); B: scanf("%d%s",&b,c);
C: scanf("%d%s",b,c); D: scanf("%d%s",b,&c);

答案解析:
正确答案:AB
&c和c两个地址值是一样的,程序的效果相同,也没错,但同时也必须把变量b的地址给scanf,故CD错误,AB正确

4【牛客网题号: JZ17 打印从1到最大的n位数】【难度:入门】牛客-剑指offer-入门

int* printNumbers(int n, int* returnSize )
{
    *returnSize=pow(10,n)-1;                           //确定最大的数字
    int *arr=(int*)malloc(sizeof(int)*(*returnSize));  //申请足够大小的空间
    for(int i=0;i<*returnSize;i++)
    {
        arr[i]=i+1;//下标从0开始,而数值从1开始
    }
    return arr;
}

5【牛客网题号: HJ73 计算日期到天数转换】【难度:简单】牛客-华为机试-简单

#include <stdio.h>
int is_leap_year(int year)
{
    if(year%4==0&&year%100!=0||year%400==0)
        return 1;
    return 0;
}
int main()
{
    int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int year,month,day;
    while(~scanf("%d %d %d",&year,&month,&day))
    {   //~不可省
        int total_day=day;//先把当前月份天数加上
        if(is_leap_year(year)&&month>2)//若闰年,且月份大于2月,则在平年基础上+1
            total_day+=1;
        for(int i=month-1;i>0;i--)
            total_day+=month_day[i];//向前累加每月的天数即可
        printf("%d\n",total_day);
        }
    return 0;
}

6 如下函数的 f(1) 的值为( )

int f(int n)
{
  static int i = 1;
  if(n >= 5)
    return n;
  n = n + i;
  i++;
  return f(n);
}
A: 5 B: 6 C: 7 D: 8

答案解析:
正确答案:C
此题注意静态局部变量的使用,static改变了i的生命周期,第一次调用函数:i初值是1,递归第二次调用函数时,i还是第一次那个变量,值已经变成了2,再一次调用函数时i就是3,依次类推

7 下面3段程序代码的效果一样吗( )

int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;
A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样

答案解析:
正确答案:B
const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为"左定值,右定向",(1)和(2)const都在*的左边,(3)中const在*的右边,所以应该选择B。

8 对于下面的说法,正确的是( )
A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同
D: 以上说法都不对

答案解析:
正确答案:D
A选项,没有考虑内存对齐。B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。C选项,a为数组首地址是常量不能改变,所以A,B,C都是错的,选择D

9 请问下列表达式哪些会被编译器禁止【多选】( )

int a = 248, b = 4;
int const *c = 21;
const int *d = &a;
int *const e = &b;
int const * const f = &a;

A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f

答案解析:
正确答案:ABCD
如果const位于 * 的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向为常量;*c和*d不能变。如果 const 位于 * 的右侧,则 const 就是修饰指针本身,即指针本身是常量;e和f不能变。

10 【牛客网题号: JZ11 旋转数组的最小数字】【难度:简单】牛客-剑指offer-简单

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int left = 0;
        int right = rotateArray.size() - 1;
        while(left < right){
            int mid = (left + right) / 2;
            if(rotateArray[mid] > rotateArray[right])
                left = mid + 1;
            else if(rotateArray[mid] == rotateArray[right])
                right--;
            else
                right = mid;
        }
        return rotateArray[left];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值