目录
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