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 D48; 现在需要把这个数组作为实参传递给一个函数进行处理。下列可以作为对应的形参变量说明的是【多选】( )
A: int D4

B: int *s8

C: int(*s)8

D: int D 8

答案与解析 CD

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

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

相关推荐
CS创新实验室13 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
似是燕归来14 小时前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发
西门吹-禅14 小时前
java springboot N+1问题
java·开发语言·spring boot
skywalk816315 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
海石15 小时前
1563分的简单题,可能就简单在能被暴力AC
算法·leetcode
海石15 小时前
1400分的dp汗流浃背之【交替子数组计数】
算法·leetcode
奋发向前wcx15 小时前
P2590 树的统计 题目解析
数据结构·算法·深度优先
imbackneverdie16 小时前
AI4S不止于分子药物:以MedPeer为代表的科研基建打开产业新增量
大数据·人工智能·算法·aigc·科研·学术·ai 4s
IT笔记16 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode16 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn