本系列博客基于董山海的<C和C++程序员面试秘笈>,旨在记录,欢迎交流,可联系 zywang@shu.edu.cn !
第一章:C/C++程序基础
1、面试题1
赋值语句:位运算与逻辑运算以及三元操作符的区别
2、面试题2
C++域操作符,注意全局变量和局部变量的区别
3、面试题3
+
+
i
++i
++i:先
i
i
i 自增
1
1
1,然后再打印
i
i
i;
i
+
+
i++
i++:先打印
i
i
i,再
i
i
i 自增
1
1
1;
−
i
−
−
-i--
−i−−:先打印
−
i
-i
−i,再
i
i
i 自减
1
1
1;
4、面试题4
内建数据类型的时候,
i
+
+
i++
i++ 与
+
+
i
++i
++i 效率没有区别;
自定义数据类型(比如类)的时候,
+
+
i
++i
++i 效率比较高;
5、面试题5
有符号变量与无符号变量的值的转换
#include <stdio.h>
//
char getChar (int x,int y) {
char c;
unsigned int a = x;
(a+y > 10) ? (c = 1): (c = 2);
return c;
}
//
int main (void) {
char c1 = getChar(7,4);
char c2 = getChar(7,3);
char c3 = getChar(7,-7);
char c4 = getChar(7,-8);
//
printf("c1 = %d\n",c1);
printf("c2 = %d\n",c2);
printf("c3 = %d\n",c3);
printf("c4 = %d\n",c4);
//
return 0;
}
输出结果为:
c
1
=
1
c1=1
c1=1,
c
2
=
2
c2=2
c2=2,
c
3
=
2
c3=2
c3=2,
c
4
=
1
c4=1
c4=1
首先,C语言中提供了很多数据类型,比如整型
(
i
n
t
)
(int)
(int)等,它们的区别就是范围的大小,int代表是有符号的整数,可正可负可为0。所以基本数据类型划分为signed(有符号)和unsigned(无符号)两大类。
整数是以原码的形式存储的,而负数是以补码的形式存储的,原码大家都知道也就是它对应的二进制码,那什么是补码呢,就是原码的反码加1,反码就是原码的各位取反。
当一个有符号和一个无符号之间的数进行相加减会发生什么呢?
是这样的:
a
+
b
a+b
a+b,首先把负数转换为无符号数,然后在进行运算。
b
b
b 转换为无符号数就是对
b
b
b 取模,
2
32
+
b
2^{32}+b
232+b,结果为4294967286。
6、面试题6
不使用任何中间变量就将a、b值进行交换,推荐异或交换方式。
#include<bits/stdc++.h>
using namespace std;
//使用加减法完成交换
void swap1(int &a,int &b){
a = a + b;
b = a - b;
a = a - b;
}
//使用局部变量进行交换
void swap2(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//使用异或运算完成交换
void swap3(int &a,int &b){
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
7、面试题7
标准头文件中的一些通用结构
#ifndef _INCvxWorksh //这边防止该头文件被重复引用,如果不存在,则定义
#define _INCvxWorksh
#ifdef _cplusplus //这边表示使用的是C++编译器
extern "C"{ //c++编译器提供的与C连接交换指定的符号,解决C++与C名字匹配问题
#endif
/*...*/
#ifdef _cplusplus
}
#endif /* _INCvxWorksh */
8、面试题8
头文件引用中的 <> 与 " " 的区别
尖括号 <>:表示这个文件是一个工程或者标准头文件,查找过程会首先检查预定义的目录,我们可以通过设置搜索路径或者命令行来修改这些目录;
引号" ":表示该文件是用户提供的头文件,现在当前文件目录中寻找,然后在标准位置寻找文件。