技术笔试面试

《帮你度过C语言新手阶段》系列之一

真正深入学习C语言已经3年有余了。不过还是有很多知识点没有记下来,在此总结一下,也帮助C语言新手度过新手难关。

如果你已经认真阅读过谭浩强C,那么复习如下知识大约只需要1个小时,而且保证包括大部分易错知识点:)

本篇是《帮你度过C语言新手阶段》系列的第一篇。

第一关:

整型常量有三种表示方法:

1 十进制整数

2 八进制整数:以0开头的数,如0376是八进制数

3 十六进制整数:以0x开头的数,如0x4a3e是十六进制数

第二关:

一个正数的补码和其原码相同。

求负数的补码的方法是:将该数的绝对值的二进制形式,按位取反加1。

如-10的16位二进制形式为0000000000001010,按位取反后为1111111111110101,再加1为1111111111110110

第三关:

一个16位的整数的表示范围为:-32768~32767

你应该知道原因。因为0000000000000000表示0,而1000000000000000表示-32768

第四关:

如果要表示大于32767的整数,则需要在printf里用%ld,而不能再用%d了,因为%d只能表示最大到32767

第五关:

一个整常量后面加上u或U,就表示此常量为无符号数。如12345u或12345U,则计算机就会在内存里按unsigned int规定的方式来存放。

如果是-12345u,那么计算机会先将-12345转换为其补码形式53191,然后再按无符号数形式存放。

如果一个整常量后面加字母l或L,则表示为long int型常量。

第六关:

当计算机遇到一个小数,则会先将它转换成一个双精度数据存储(64位),虽然提高了精度,但这样运算速度就会降低。所以如果我们更注重运算速度,可以在小数后面加上f或F,来告诉计算机按单精度处理,不要转换为双精度数。

第七关:

在不同类型数据的混合运算中,有一些隐蔽的规则:

1 char和short是必须先转换为int才可以进行运算的。

2 float一律转换为双精度型再进行运算,即使是两个float型数据相加,亦是如此。

3 如果int和double进行运算,那么int先转换成double,然后两个double进行运算

4 如果int和unsigned int进行运算,那么int要先转换为unsigned int,然后两个unsigned int进行运算

5 这些类型转换是由系统自动完成的。

第八关:

在强制类型转换时,得到的是一个所需类型的中间变量,原来变量的类型不会发生变化,如(double)(x),x的类型本身不会变化。

(后加的)第八点五关:

单目运算符包括:!,~,++,–,-,(type),*,&,sizeof

单目运算符的优先级仅次于(),[],->,.这四个(并非真正意义上的)运算符。

单目运算符的结合性是自右向左。如-i++,即-(i++);如*i++,即*(i++)。

第九关:

C编译系统会使用贪心法来识别运算符,如 i+++j,会被理解为(i++)+j

第十关:

赋值运算符的结合性也是“自右向左”。如a=b=5,即a=(b=5)

在C语言中,直接声明int a=b=c=3是错误的,但如果先声明int b;int c;,再声明int a=b=c=3;就是正确的!

第十一关:

逗号表达式形如:表达式1,表达式2

逗号表达式的值是表达式2的值。

由于赋值运算符的优先级高于逗号运算符,所以a=3*5,a*4被理解为(a=3*5),a*4

逗号运算符基本上是优先级最最低的一个运算符,而赋值运算符基本上是排在倒数第二。(逗号全班倒数第一。赋值全班倒数第二,呵呵),你一定想知道倒数第三是谁,告诉你,条件运算符,也就是C中唯一的三目运算符”?:”。

第十二关:

a=3叫做赋值表达式,而a=3;叫做赋值语句,对,就是因为多了一个分号。

只有一个分号也能构成一个语句,叫做“空语句”。

如果用{}把一堆语句括起来,那么就叫复合语句,也叫分程序。

第十三关:

C语言提供的关系运算符有6种,你先想想,再看答案:

<, <=, >, >=, ==, !=,其中前四种的优先级要高于后两种。

C语言提供3种逻辑运算符,你知道么:

&&,||,!,这三种优先级各不相同,!优先级最高,&&次之,||优先级最低。而且更复杂的是,&&和||的优先级低于关系运算符,而!高于算术算符

总结起来就是:

逗号运算符<赋值运算符<||<&&<关系运算符<算术运算符<!

第十四关:

具有自右向左结合性的运算符都包括:赋值运算符,单目运算符和条件运算符。如a>b?a:c>d?c:d,即a>b?a:(c>d?c:d)

第十五关:

switch语句的语法结构:

switch(表达式)

{

case 常量表达式1:语句1

case 常量表达式2:语句2

case 常量表达式n:语句n

default:语句n+1

}

各个case和default的出现次序不影响执行结果,你愿意的话,完全可以先出现default,再出现其他case。

第十六关:

for(表达式1;表达式2;表达式3){…}

for语句,如果省略表达式1和表达式3,只留表达式2,那么相当于while语句。

for(;;)相当于while(1).

巧用for语句的一个例子:for(i=0;(c=getchar()!=’\n’);i+=c);

第十七关:

C语言中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再顺序存放第二行的元素…

多维数组在内存中的排列顺序是,第一维的下标变化最慢,最右边的下标变化最快。如a[0][0][0]->a[0][0][1]->a[0][0][2]->a[0][0][3]->a[0][1][0]…

二维数组的初始化:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; (推荐)

相当于:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; (不推荐,因为界限不清晰)

int a[3][4]={{1},{5},{9}};只对各行第1列的元素赋初值,其余元素都为0.

如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省略,如:

int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

在定义时也可以只对部分元素赋值而省略第一维长度,但必须分行赋初值:

int a[][4]={{0,0,3},{},{0,10}};

第十八关:

字符数组初始化,可以加花括号,也可不加:

char c[]={“I am happy”};

等价于:

char c[]=”I am happy”;

等价于:

char c[]={‘I’,’ ‘,’a’,’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’\0′}; 务必加上最后的’\0’,否则可不等价哦。

第十九关:

scanf函数会以空格来作为结束符。所以scanf(“%s”,str)的话,

如果输入是how are you? 那么最后str中存入的只有how。这点要特别注意。

[未完待续…]

over~

3条评论

  1. 第二关
    如-10的16位二进制形式为0000000000001010,按位取反后为1111111111110101,再加1为1111111111110110 有误

    改为:
    如-10的16位二进制形式为1000000000001010,按位取反后为1111111111110101,再加1为1111111111110110

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *