C语言—每日选择题—Day65

前言

我们的刷题专栏又又又开始了,本专栏总结了作者做题过程中的好题和易错题。每道题都会有相应解析和配图,一方面可以使作者加深理解,一方面可以给大家提供思路,希望大家多多支持哦~

第一题

1、如下代码输出的是什么( )

cpp 复制代码
char a = 101;
int sum = 200;
a += 27;sum += a;
printf("%d\n",sum);

A: 327

B: 99

C: 328

D: 72

答案与解析 D

本题考察的是:类型不同时的运算,会发生整型提升或截断,且二进制计算都是用补码

负数补码 = 源码取反 + 1
在a += 27 时:a为char类型,char类型为1字节 = 8bit

而 a += 27; a = a + 27;

在右侧,一个char类型与int类型相加,会发生char整型提升( 1字节-> 4字节 )

a = 128;而在赋值表达式中,左侧为char类型,右侧为int类型,会发生整型截断

128 = 00000000 00000000 00000000 10000000

所以截断之后为 10000000

而a为char类型,有符号的类型,那最高位就代表符号位 ,最高位为1,是负数
在sum += a中:sum = sum + a;

a = 1000 0000 ,因为是负数,需要转换为补码:1000 0000

在右侧,sum + a,为int和char的相加,char会发生整型提升,负数高位补1

sum : 0000 0000 0000 0000 0000 0000 1100 1000

a : 1111 1111 1111 1111 1111 1111 1000 0000

sum + a : 1 0000 0000 0000 0000 0000 0000 0100 1000

由于超出的32位会舍去最高位:0000 0000 0000 0000 0000 0000 0100 1000 = 72

第二题

2、对于下面代码执行后输出的是什么( )

cpp 复制代码
int value = 1024;
char condition = *((char*)(&value));
if(condition) 
    value += 1; 
condition = *((char*)(&value)
if(condition) 
    value += 1; 
condition = *((char*)(&value)
printf("%d %d", value, condition);

A: 1026 1

B: 1025 0

C: 1025 1

D: 1024 0

答案与解析 D

这里考察的就是大家对指针类型的解引用具体可以访问多少字节的理解,还涉及了大小端

相关博客:详谈【指针解引用】与【指针加整数】_指针解引用之后-CSDN博客
无论是大端字节序还是小端,取出来的都是0,结果都一样

第三题(易错)

  1. 假设在32位机器上,读代码选结果( )
cpp 复制代码
void func(char para[100])
{
    void *p = malloc(100);
    printf("%d, %d\n", sizeof(para), sizeof(p));
}

A: 4,4

B: 100,4

C: 4,100

D: 100,100

答案与解析 A

记住sizeof就是对括号里面变量的类型求大小

而数组在函数传参的时候会降低为指针类型,char* para,所以sizeof(para) = 4;

因为p的类型为void*,所以sizeof(p) = 4,

第四题

4、以下程序执行后的输出结果为( )

cpp 复制代码
#include <stdio.h>
void func(char *p) 
{ 
    p = p + 1; 
}
    int main()
{
    char s[] = {'1', '2', '3', '4'};
    func(s);
    printf("%c", *s);
    return 0;
}

A: 2

B: 编译错误

C: 1

D: 无法确定

答案与解析 C

形参的改变不会影响实参,所以s依旧是代表的首元素地址,*s = 1
最重要的一点:

数组名的类型是char* const ,数组名代表首元素地址,不可被改变,是const pointer

第五题

5、已知数组D的定义是 int D[4][8]; 现在需要把这个数组作为实参传递给一个函数进行处理。下列可以作为对应的形参变量说明的是【多选】( )
A: int D[4][ ]

B: int *s[8]

C: int(*s)[8]

D: int D[ ][8]

答案与解析 CD

A、D:他们是想通过二维数组来传参,但是作为二维数组传参,必须把列的数字标出来,否则错误,所以A错误,D正确
在数组D的传参,传的是数组名D,而数组名为首元素地址,二维数组的数组名是整个第一行的地址,所以类型为int (*)[8],B与C,只有C的类型匹配,所以C正确

相关博客:C语言:指针详解【图解 + 练习】-CSDN博客

相关推荐
Emilia486.1 小时前
八大排序算法
算法·排序算法
blammmp2 小时前
算法专题十九:记忆化搜索(暴搜->记忆化搜索)
算法·深度优先·记忆化搜索
纵有疾風起2 小时前
C++—string(1):string类的学习与使用
开发语言·c++·经验分享·学习·开源·1024程序员节
Molesidy2 小时前
【随笔】【QT】QT5.15.2版本的最新下载方式!!!
开发语言·qt
MicroTech20252 小时前
边缘智能的创新:MLGO微算法科技推出基于QoS感知的边缘大模型自适应拆分推理编排技术
科技·算法·ai
luoqice2 小时前
如何编译QT可执行release程序
c语言
二进制person3 小时前
Java EE初阶 --多线程2
java·开发语言
yue0083 小时前
C#理论学习-WinForm实践开发教程总结
开发语言·学习·c#
王哈哈^_^4 小时前
【数据集】【YOLO】目标检测游泳数据集 4481 张,溺水数据集,YOLO河道、海滩游泳识别算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·分类·视觉检测
巴里巴气4 小时前
第73题 矩阵置零
线性代数·算法·矩阵