C/C++笔试易错与高频题型&图解知识点(一)—— C语言部分

目录

1.printf系列问题

1.1 printf("%5.2s", )

 1.2 printf函数栈帧调用规则

1.2.1 什么是大小端

1.2.2 printf函数栈帧

 1.3 整形数据的表示形式与print格式化参数

1.4 printf格式化串

2. 二维数组初始化

3 结构体对齐与更改默认对齐数

3.1 结构体对齐规则

3.2 更改默认对齐数


1.printf系列问题

1.1 printf("%5.2s", )

#include <iostream>
using namespace std;
int main() {
	printf("%s\n", "string");
	printf("%5.3s\n", "string");    //总共打印五个字符,取"string"的前三个字符,右对齐,其余字符用' '占位
	printf("%-5.4s\n", "string");   //总共打印五个字符,取"string"的前四个字符,左对齐,其余字符用' '占位
	printf("%.5s", "string");       //打印"string"的前五个字符
	return 0;
}

打印结果:


 1.2 printf函数栈帧调用规则

假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?

#include <stdio.h>
int main(){
    long long a = 1, b = 2, c = 3;
    printf("%d %d %d\n", a, b, c); 
    return 0;
}

A. 1,2,3

B. 1,0,2

C. 1,3,2

D. 3,2,1

答案:B

1.2.1 什么是大小端

小端存储(Little Endian):字节或半字节的最低位字节(Least Significant Bit,LSB)存放于内存最低位字节地址上。相反,大端存储表示,低位字节存高位地址

1.2.2 printf函数栈帧

 解析:

• 由于是小端字节序且long long类型站八个字节,十六进制表示下a在内存中的值由低位到高位为01 00 00 00 00 00 00 00,b和c同理;

• printf函数参数入栈从右往左入栈,打印时,由于是%d,于是当作int取栈顶四个字节,于是打印结果为 1 0 2


 1.3 整形数据的表示形式与print格式化参数

有以下程序 程序运行后的输出结果是()

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
 int m=0123, n=123;
 printf("%o %o\n", m, n);
 return 0;
}

A. 0123 0173

B. 0123 173

C. 123 173

D. 173 173

答案:C

二进制:0b101   

八进制:0101        --->        %o

十进制:101        --->        %d

十六进制:0x101        --->        %x

#include <iostream>
int main() {
	int a = 0b101;
	int b = 0101;
	int c = 101;
	int d = 0x101;
	printf("%d %d %d %d", a, b, c, d);  // 5 65 101 257
	printf("%d %o %d %x", a, b, c, d);  // 5 101 101 101
}

1.4 printf格式化串

执行下面语句后的输出为

int I=1;
if(I<=0) 
 printf("****\n") ;
else 
 printf("%%%%\n");

A. %%

B. ****

C. 有语法错,不能正确执行

D. %%%%

答案:A

printf(格式化参数,参数1, 参数2...)

格式化参数指明了后面参数的格式化方法, 例如%d, %f,若%后面跟的是无效字符,编译器将会忽略掉第一个%

2. 二维数组初始化

以下能对二维数组a进行正确初始化的语句是()

A. int ta[2][]={{0,1,2},{3,4,5}};

B. int ta[][3]={{0,1,2},{3,4,5}};

C. int ta[2][4]={{0,1,2},{3,4},{5}};

D. int ta[][3]={{0,,2},{},{3,4,5}};

答案:B

二维数组初始化方式与规则:

• 行能省,列不能省

• 花括号内表示每一行内容,不足用0初始化

	int arr[][3] = { {1}, {}, {4, 5, 6} };

• 无花括号,按照初始化列表顺序顺序依次初始化,多余行的其他未初始化部分,初始化为0

	int arr[][3] = { 1, 2, 3, 4 };

3 结构体对齐与更改默认对齐数

下面两个结构体 在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是()

struct One{
double d;    //0-7
char c;    //8
int i;    //12-15
}
struct Two{
char c;    //#pragma pack(4):0-1    #pragma pack(8):0-1
double d;    //#pragma pack(4):4-11    #pragma pack(8):8-15
int i;    //#pragma pack(4):12-15    #pragma pack(8):16-20
}

A. 16 24,16 24

B. 16 20,16 20

C. 16 16,16 24

D. 16 16,24 24

答案:C 

3.1 结构体对齐规则

1)第一个成员在结构体变量偏移量为0的地址处

2)其他成员变量要对齐到对齐数的整数倍的地址处。

对齐数:编译器默认对齐数(VS中默认为8)与该成员大小的较小值

3)结构体总大小为最大对齐数的整数倍

4)嵌套结构体对齐到自己的最大对齐数的整数倍处,整体大小就是所有对齐数(含嵌套结构体的对齐数)的整数倍;

3.2 更改默认对齐数

#pragma pack(4)  //更改默认对齐数为4
#pragma pack(8)  //更改默认对齐数为8

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dusong_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值