C语言--每日选择题--Day32

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

如果大家对读研究生和就业不知道如何抉择,我的建议是看大家的经济基础,如果家里不是很需要你们工作,就读研提升自己的学历,反之就就业;毕竟经济基础决定上层建筑;

第一题

1. 下面代码的结果是:( )

#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};
    printf("%d\n", sizeof(arr));
    return 0;
}

A.4

B.16

C.20

D.5

答案及解析 B

本题考查的是逗号表达式和sizeof,不知道大家看没看到逗号表达式;

数组arr = {1, 2, (3, 4), 5};里面有一个逗号表达式,结果为最后一个表达式的值;

所以arr = {1, 2, 4, 5};

sizeof数组名,计算的是整个数组的大小哦

则sizeof(arr) = 4 * 4 = 16;

第二题

2. 下面代码说法正确的是()

char str1[] = "abcdefg";
char str2[] = { 'a','b','c','d','e','f','g'};

A.数组str1和数组str2等价

B.数组str1和数组str2的长度相同

C.sizeof(str1)>sizeof (str2)

D.strlen (str1)>strlen (str2)

答案及解析 C

本题考查的是你对字符数组和字符串的认识;

字符串是指默认末尾有隐藏\0的;而字符数组是默认没有的;

sizeof计算的是占用的空间,包含\0;

而strlen是计算的长度,以\0为结束标志;


A:错误,字符串是默认末尾包含\0,而字符数组不是;

B:长度指的是strlen求的结果,因为我们不知道是str2的\0在什么位置

所以strlen(str2) ≥ strlen(str1)

C:正确,因为str1多个隐藏的\0;

D:看B;

第三题

3. 下面代码的结果是:( )

#include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5};
  short *p = (short*)arr;
  int i = 0;
  for(i=0; i<4; i++)
  {
    *(p+i) = 0;
  }
  for(i=0; i<5; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

A.1 2 3 4 5

B.0 0 3 4 5

C.0 0 0 0 5

D.1 0 0 0 0

答案及解析 B

其实吧,对于我们期末考试来说,这种题已经够用了,算的上是相对的难题了,毕竟是涉及指针的知识,但是如果你是要学好,学扎实,这种题你不能认为是难题;


我们要用二进制数表示数组中元素;1字节= 8个比特位 int为4字节  short为2字节

先明确下面知识点

1. 对指针的加法,是表示移动的字节数,这个字节数是根据指针指向的内容的数据类型来的

2. 解引用的时候取的字节数也是根据指针指向的内容的字节数来的;解引用要从低地址开始

3. 这里还涉及大小端,但是先不用这个讲解

第四题

4. 下面程序的结果是:( )

int main()
{
  int aa[2][5] = {10,9,8,7,6,5,4,3,2,1};
  int *ptr1 = (int *)(&aa + 1);
  int *ptr2 = (int *)(*(aa + 1));
  printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
  return 0;
}

A.1, 6

B.10, 5

C.10, 1

D.1, 5

答案及解析

本题画图解释

二维数组可以当成存放多个一维数组的首元素地址的数组;

所以二维数组的数组名其实是一个二级指针;

第五题

5. 下面代码输出的结果是()【32位系统】

#include<stdio.h>
#include<stdlib.h>
int main()
{
  int a = -3;
  unsigned int b = 2;
  long c = a + b;
  printf("%ld\n", c);
}

A:-1

B:4294967295

C:0x7FFFFFFF

D:0xFFFFFFFF

答案及解析 A

本题考查的是对隐式类型转换的理解;什么是隐式类型转换呢?

在进行运算操作的时候,我们两边的操作数的数据类型是不同的;

比如进行加减乘除,比较和赋值运算的时候,数据类型的不同,就会发生隐式类型转换;

规则:

1. 有符号数转换成无符号数,低字节转换为高字节;

2. 赋值运算符,若左操作数字节是小于右操作数的,会发生截断;

二进制要用补码计算

正数的补码就是原码

负数的补码:原码按位取反+1

负数的原码:补码按位取反+1


a + b ,因为b是无符号数,所以

a:原码 1000 0000 0000 0000 0000 0000 0000 0011

     反码 1111 1111 1111 1111 1111 1111 1111 1100

     补码 1111 1111 1111 1111 1111 1111 1111 1101

b:补码 0000 0000 0000 0000 0000 0000 0000 0010

因为a + b ,a 会转换成无符号整数,但其实a不会变,a会拷贝一个临时变量作为a的无符号数,所以:

a的临时变量的补码:1111 1111 1111 1111 1111 1111 1111 1101

b的补码:                   0000 0000 0000 0000 0000 0000 0000 0010

a + b :1111 1111 1111 1111 1111 1111 1111 1111

但是c为long类型,是有符号的,32位下long是4字节,

c = a + b

c的补码:1111 1111 1111 1111 1111 1111 1111 1111

c是有符号的

反码:1000 0000 0000 0000 0000 0000 0000 0000

原码:1000 0000 0000 0000 0000 0000 0000 0001

最后c = -1


相关文章
|
1月前
|
C语言
C语言—每日选择题—Day60
C语言—每日选择题—Day60
|
1月前
|
编译器 C语言
C语言—每日选择题—Day61
C语言—每日选择题—Day61
|
1月前
|
编译器 C语言
C语言—每日选择题—Day57
C语言—每日选择题—Day57
|
1月前
|
C语言
C语言—每日选择题—Day56
C语言—每日选择题—Day56
|
1月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
32 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
1月前
|
算法 C语言 C++
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(中)
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
59 1
|
1月前
|
算法 编译器 C语言
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(上)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
29 3
|
1月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(中)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
26 1
|
1月前
|
存储 编译器 C语言
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(下)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
28 0
|
1月前
|
Java 编译器 定位技术
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(中)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
25 0