C语言笔试面试题集锦与解析

需积分: 41 26 下载量 188 浏览量 更新于2024-07-18 1 收藏 431KB PDF 举报
"C语言 笔试 面试题 错题解析" 1. C语言关键字:`default`是C语言中的一个关键字,它只在`switch`语句中使用,用于定义没有匹配到任何`case`的情况。 2. 位运算:题目中的`c=a∧b<<2;`涉及到位运算。`b<<2`表示`b`向左移动两位,相当于乘以4(在二进制中相当于`00010100`向左移动两位)。`a`假设为1(二进制`00000011`),`b`为6(二进制`00000110`)。`a∧b`进行按位与操作,结果为2(二进制`00000010`)。然后这个结果再左移两位,即`00010000`,转换为十进制是16。 3. 结构体大小:在C语言中,结构体的大小是其成员大小的总和加上对齐填充。题目中`struct date`包含一个`long *`(通常4字节)、一个`struct date *`(也是4字节)和一个`double`(8字节)。在small模式下,指针占用2字节,但是结构体成员通常按照最大的成员大小进行对齐,所以结构体会按照8字节对齐。因此,结构体大小为2个指针(8字节)+ `double`(8字节)+ 填充(4字节)= 20字节。 4. 自增运算符优先级:`t=++x||++y;`这行代码中,`++x`先执行,使得`x`变为4,然后`||`运算符具有短路特性,如果左侧为真(非0),右侧就不会执行。因此,`++y`不会被执行,`y`保持原来的值3。 5. for循环累加:`for(int i=0;i<10;i++,sum+=i);`这个循环中,`sum`从0开始,每次循环累加`i`的值,直到`i=9`,所以`sum`的最终值为`0+1+2+...+8+9`,这是一个等差数列求和,结果是`45`。 6. 比较浮点数:在C语言中,由于浮点数的精度问题,不能直接使用`==`或`!=`来比较浮点数是否相等。正确做法是设置一个很小的误差范围(如`EPSILON`),判断两个浮点数的差值是否在这个范围内。 7. 字符数组和指针:`sizeof`是C语言中的运算符,用于计算数据类型或变量的大小。`str`是一个字符数组,其大小包括字符串结束符`\0`,所以`sizeof(str)`是6。`p`是一个指向`str`的指针,其大小通常是4字节(32位系统)。`n`是一个整型变量,大小也是4字节。 8. 字符串常量和指针:`"AAA"`是字符串常量,存储在只读内存区域。`char *s="AAA";`定义了一个指向字符串常量的指针`s`。尝试修改`s[0]`是非法的,因为字符串常量是不可修改的。正确的做法是使用`char s[] = "AAA";`来创建可修改的字符数组。 9. 变量类型和指针:在C语言中,`const char *`表示指针指向的内容是不可修改的,但指针本身可以重新赋值指向其他字符串常量。 10. 函数参数传递:`findArg`函数的参数如果是`const char *`,则表明传入的是字符串常量,函数内部不应尝试修改其内容。在C语言中,函数参数传递是按值传递,对于指针,实际上是复制指针的值,而不是指向的对象。所以,即使指针指向的是常量,函数内部仍然可以通过改变指针本身的值来指向其他地方,但不能修改指针所指向的常量内容。