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博客

相关推荐
白帽攻防录2 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛2 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
2603_965148112 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
生态学者3 小时前
Global Change Biology | 森林越“步调一致”,反而越怕干旱?树木生长与叶片活动的同步之谜
大数据·人工智能·算法·r语言·微信公众平台
xixiaoyunya3 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
lsswear3 小时前
Agent 框架新手入门与实战部署指南
大数据·人工智能·算法
学逆向的3 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务4 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
Data analyse4565 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
打工仔折腾 AI5 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战