《C语言深度解剖》附录解析,附测试代码
前言
即将面对各种招聘会场,即将迎来各种面试题目,师兄推荐我一本书《C语言深度解剖》买来看看。书的前言部分说明:在开始学习本书之前做一下附录1的C语言基础测试题并根据分值评分,100分以上可以把这本书扔了,80分以上说明C语言基础还不错,50分一下不要气馁,努力学习本书,结果我做了一边后,得分不说了,好好看书吧! <_>但在看完解析后,确实收益匪浅,拉出来大家探讨探讨。 相信对这篇博客感兴趣的你肯定手上有书或者电子版,那如果是无意翻到这篇博客,想看看这本书,在我的资源里可以免费下载本书的pdf电子版。附录部分的题目我就不例举了。另外,测试代码的测试环境为Visual Studio 2012
1.
知识点:
隐式转换
1.算术运算:低类型转换为高类型
2.赋值表达式:表达式的值转换为左边变量的类型
3.函数调用:实参转换为形参的类型
4.函数返回值:return表达式转换为返回值类型
测试代码:
#include <stdio.h>
void main(void)
{
unsigned int i=6;
int j=-20;
(i+j>6)? printf(">6\r\n",j):printf("<6\r\n");//输出>6
printf("i+j:%d\r\n",i+j);//i+j:输出-14
getchar();
}
看到这很多人就开始挠头了,“-14”为什么大于"6"???懵了?我们来根据上面的知识点梳理一下。有符号-20会转换为无符号0xffffffec(补码),一个很大的值,这样看i+j肯定>6。那后面为什么输出为"i+j:输出-14"。这就牵扯到printf()函数的转换说明,这里不细讲,主要是%d:有符号十进制,%u:无符号十进制,%x:无符号十六进制。在上面的代码中加入下面补充,你肯定理解的透透的了。
printf("i+j:%u\r\n",j+i);//无符号十进制
printf("i+j:%x\r\n",j+i);//无符号十六进制
(i+j==0xfffffff2)? printf("我很帅\r\n",j):printf("你很帅\r\n");//判断语句
2.
知识点:
字符数组
C 语言规定以字符’\0’作为字符串结束标志。例如
char c[ ]={
‘F’,’e’,’i’,’L’,’o’,’n’,’g’};//字符数组中没有’\0’表示是普通的字符数组
char c[ ]= {
‘F’,’e’,’i’,’L’,’o’,’n’,’g’,’\0’};//字符数组以字符’\0’结束表示是字符串
char c[ ]=“FeiLong”;//使用字符串方式进行赋值时,系统会自动在字符串末尾添加’\0’
printf 等函数处理字符串的时候通常都是“不见\0 不死心”,因此使用字符串的时候一定不要忘了结尾的\0。
strcpy()函数
strcpy,即string copy(字符串复制)的缩写。
原型声明:char strcpy(char dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。注意strcpy和printf 一样,处理字符串的时候通常都是“不见\0 不死心”。
测试代码:
#include <stdio.h>
#include <string.h>
void main(void)
{
char string[10],str1[10];
int i;
for(i=0;i<10;i++)
{
str1[i]='a';
}
//str1[9]='\0';//添加结束符
strcpy(string,str1);//strcpy遇到‘\0’结束,str1无结束标志
printf("%s",string);//printf打印遇到‘\0’结束
getchar();
}
如果不强制添加\0,strcpy()会一直copy,程序出错。添加代码中注释的部分,正常输出。
3.
知识点:
static的作用
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。可以通过下面代码进行测试。
#include <stdio.h>
#include <string.h>
void fun1(void)
{
static int i=0;
i++;
printf("i value:%d\r\n",i);
printf("i address:%p\r\n",&i);
}
void fun2(