C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节

1.

 

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第1张图片

易错点在于数组初始化的方式,上面的有'\0',下面的没有,C语言语法规定字符串自动追加'\0'.

 

2.

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第2张图片

一维数组能如此初始化?显然不行

 

所以下面这题答案自然出来了,选B:

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第3张图片

3.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第4张图片

答案:B

解释:全局可以在任何一个地方调用,很难保证数据的准确性和安全性

 

4.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第5张图片

函数不可以嵌套定义,但是可以嵌套声明(一般声明在全局里)

 

5.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第6张图片

答案:C

无限递归?内存有限,递归次数多了就栈溢出了

 

 

6.

递归实现my_strlen

注意return的要先++,不然死递归了.建议写成  return(s+1)

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第7张图片

 

 

 

7.

 

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第8张图片

 

printf的返回值是打印字符的个数,注意 \n 也算进去了(转义字符也是字符)

所以解题时另起一行进行换行操作.

 

拓展:printf("%d",printf("Hello world"));

结果是什么?

12?

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第9张图片

这里说明了printf是从右往左运行

 

 

8.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第10张图片

 

少了头文件所以报错了?问题在语法错误   

             

正确写法:

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第11张图片

 

 

9.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第12张图片

 

知识点:printf("%0xd",a);

x表示域宽  %0xd就表示位数小于域宽 就补0

 

比如:

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第13张图片

 

10.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第14张图片

 

上述代码有问题吗?

要求输出是整数所以要求用%d 

我都这么说了肯定有问题啊....

是不是我把输入的a定义为double型导致的错误 

显然不是...(我定义double因为是要进行浮点数的运算,不过定义int自然也可以,运算时候自然出现精度提升)

 

问题在于打印的格式:%d

   浮点数和整型的存储方式不同,这也是%f和%d输出时的差异所在了

经过运算后此时a*3.156e7是浮点型

%f以浮点数的形式打印double或者float类型当然没问题

而%d以整型的方式去读取一个浮点型,自然得到的结果会很奇怪

 

 

关于精度提升与整型提升,传送门:https://www.cnblogs.com/jianghg/p/4417190.html

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第15张图片

 

个人理解:两个操作数,往精度高范围大的那个类型转换进行运算,运算完毕后根据打印的格式或者是赋值变量的格式进行转换

 

这题ac的代码;

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第16张图片

 

11.

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第17张图片

 

问题在哪?

当乘法表达式或者除法表达式特别长时需要特别注意运算顺序

正确的 代码:

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第18张图片

 

12.

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第19张图片

这里没说多少组数据,所以可以利用cin返回值的特性

EOF是文件结束的标志

 

注意:大多数情况下其返回值为cin本身(非0值),只有当遇到EOF输入时,返回值为0。

 

 

13.

要求 根据成绩高低排名,排名后同时打印出成绩主人的名字和其成绩

C++:重载

C:自己写一个函数

用纯C写这个函数时,遇到了一个问题如何交换两个人的名字(当然for循环一个字符一个字符交换当然可以,但是时间复杂度有点高)

临机一动,不如直接用strcpy这个函数,也方便的多,定义一个临时数组tmp

具体代码如下:

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第20张图片

题解代码:

//我是C++的头文件
int n;
struct student
{
	char name[100];
	int grade;

};
student s[105];
void swap_gra(int*x, int*y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
void swap_name(char* x, char*y)
{
	char tmp[100];
	strcpy(tmp, x);
	strcpy(x, y);
	strcpy(y, tmp);
}
void pr()
{
	for (int i = 1; i <= n; i++)
	{
		printf("%s %d\n", s[i].name, s[i].grade);
	}
}
int main()
{
	
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		scanf("%s%d", &s[i].name, &s[i].grade);
	}
	printf("\n");
	for (int i = 1; i <= n;i++)
	for (int j = 1; j s[j + 1].grade)
		{
			swap_gra(&s[j].grade, &s[j + 1].grade);
			swap_name(s[j].name, s[j + 1].name);
		}
	}
	pr();
	return 0;
}

 

14.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第21张图片

指针类型不同,操作的字节数不同,从内存的角度入手

 

初始化数组时arr里的状态;

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第22张图片

操作完毕后:

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第23张图片

 

原因:short型指针一次只能操作两个字节,操作四次一共八个字节,一个整型四个字节,所以只能更改前面两个数字

四次操作如下图所示:(前面时低地址,后面是高地址)

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第24张图片

 

15.

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第25张图片

答案:C

 

大小端存储的问题

以vs的小端存储为例(高字节存高位,低字节存低位

                          高位            低位

a(十六进制)::11  22  33  44

存入内存::   44   33  22  11

                      低地址          高地址

题目中pc指针就是指向44,又是char型指针操作一个字节,自然吧44改为00

打印是从低位打印到高位;也就是 11 22 33 00

 

 

15.

 

 C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第26张图片

答案:A

释放后的指针依然指向原地址,free 的意义在于告诉系统目标地址可以被回收。

所以肯定不是置为NULL.

 

16.

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第27张图片

c溢出了  自然是44

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第28张图片

为什么a+b是三百?

printf传入参数时不是根据 是什么类型 然后 传入 该类型的字节,说的有点绕举个例子

传入参数是char类型时,传入的是4个字节,而不是char类型的1字节(printf默认时4字节)

而double float longlong为八字节,读入float时会自动转为double

%lld %llf %f %llx读取的时候也是8字节,其余读取4字节

 

 

17.

 

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第29张图片

int a,a是十六进制,

0x八位数字

为什么?

一个字节是八位,四位二进制 是 一个十六进制,所以一个字节可以存两个十六进制数字

所以一个int 类型可以存八个十六进制数

所以0x1234==0x00001234

注:0x1234 != 0x01020304

大端存储:低位存高地址,高位存低地址,

如下图所示

C/C++语言初阶刷题记录---==关于我第一遍学习C语言未注意的一些细节_第30张图片

char指针操作一个字节,也就是00,所以选A

 

 

--------------------------------------

 

感谢阅读!

 

你可能感兴趣的:(c++,算法,c语言)