C/C++程序员面试宝典(一)

基本数据类型
1、基础数据类型分为三种:整数型、浮点型和void型。(任何表达式都是可转换为void类型的)
2、整型:表示整数、字符和布尔值的算术类型。
     包括short、int、long、char、bool等
3、绝对值小于1的浮点数,其小数点前面的0可以省略,例如,0.22可写为.22。
4、常量:整型常量、浮点型常量、字符型常量、字符串常量、转义字符常量()、地址常量(&)
5、常量是不可以改变值的量,变量是可以改变值的量;
常量在定义时必须初始化,变量在定义时可以暂不进行初始化;
常量不可以寻址,它的地址不允许赋值给非常量指针,变量可以寻址;
常量有相对较高的编译执行效率(以立即数形式编译进指令)。

int main()
{
	const char a; //error
	const char a = 't'; //OK,如果是对指针变量初始化,最好是通过取其它变量的地址
	a = 's'; //error
	
	char p;
	p = 'u'; //OK
	a = p; //error
	
	int b;
	int *c = &b; //OK
	const int d = 1;
	int *e = &d; //error

	return 0;
}

操作符
6、表达式由操作符、操作数字和标点符号组成。
操作符:一元操作符(单目运算符++、–)、二元操作符(+、-、*、/、&&)、三元操作符(条件? =)。
7、优先级决定了表达式的运算顺序。
8、逻辑操作只返回true或false这两种值,可以用来做判断条件,不会改变被操作数的值。
逻辑与、逻辑或:短路求值,逻辑非:取反。
9、前自增自减操作的优先级大于=,而后自增自减操作的优先级小于=,后自增自减操作后表达式的值不会发生改变。

int i=0,j;
j=++i; //前自增,j=1,i=1
j=i++; //后自增,j=1,i=2

10、变量的自增自减是修改变量的值,指针的自增自减是修改指针的指向地址。

变量
11、变量是左值,可以出现在赋值语句的左边和右边,数字字面值是右值,不能被赋值。
12、变量初始化:直接初始化(灵活,效率高)、赋值初始化

int a(100); //直接初始化
int b = 200; //赋值初始化
  • 1
  • 2

13、变量可以声明多次,但有且仅有一次定义。声明的主要目的是表明变量的类型和名称,而定义的目的是为变量分配存储空间。

extern int a; //声明变量,不分存储空间
int a; //定义变量,分配存储空间
  • 1
  • 2

14、变量的存储类型:
自动类型变量(auto):局部类型的变量
静态类型变量(static):为了在下次调用该函数时,能使用上次调用后得到的该变量的值
寄存器类型变量(register):直接使用cpu的寄存器,提高对这类变量的存储速度
外部类型变量(extern):在一个文件中引用另外一个文件的全局变量(要想不能被其它文件引用,可以加上static 全局变量)

引用
15、引用是对象的别名,主要用作函数的形参来使用。
16、非const的引用不能用于指向const对象的引用。

const int a = 100;
const int &b = a; //OK
int &c = a; //error
  • 1
  • 2
  • 3

C与C++的联系
17、C语言是结构化的编程语言,它是面向过程的,考虑的是实现过程,C++是面向对象的,考虑的是整个程序模型。

编程规范
18、变量名由数字、字母和下划线组成,且必须以字母或下划线开头,不可以与保留关键字和标准库冲突。

循环语句
19、如果循环中需要修改的变量值不需要初始化或者已经初始化了,则可以省略初始化语句(例如int i=0)。
20、while循环和do-while循环的主要区别在于,如果条件语句为false,while不会执行循环体,而do-while保证循环体执行一次。
21、for循环通常用于需要遍历的情况,而while和do-while通常用于状态判断并根据状态执行操作。
22、continue语句只能出现在循环语句中,而break语句可以出现在switch语句中。continue是终止当前循环并进入下一次循环体的执行,break语句会退出循环语句。

switch语句
23、在switch结构中可以在最后一个case标号或default标号后面定义变量,或者引入块语句来定义变量,这样可以保证变量在使用前可以被定义和初始化。

递归
24、递归算法解题的效率相对较低,在递归次数过多容易造成栈溢出。
25、汉诺塔问题的递归求解
在这里插入图片描述

#include <iostream>
#include <cstdio>
using namespace std;
 
int cnt; //全局变量,每次调用会+1

void move(int id, char from, char to) // 打印移动方式:编号,从哪个盘子移动到哪个盘子
{
    printf ("step %d: move %d from %c->%c
", ++cnt, id, from, to);
}
 
void hanoi(int n, char x, char y, char z)
{
    if (n == 0) //注意递归的出口,不然就是死递归了
        return;
    hanoi(n - 1, x, z, y); //将n-1个在x柱子上的盘子通过z这个柱子移动到y这个柱子上。
    move(n, x, z);
    hanoi(n - 1, y, x, z); //将n-1个在y柱子上的盘子通过x这个柱子移动到z这个柱子上。
}
 
int main()
{
    int n;
    cnt = 0;
    scanf ("%d", &n);
    hanoi(n, 'A', 'B', 'C');
    return 0;
}

输入流与输出流
26、输入输出可以重载,减少代码量。

istream& operator>>(istream &in,类名 &s); //返回值是流的引用,这样可以连续赋值
ostream& operator<<(ostream &out,const 类名 &s);
  • 1
  • 2

异常与错误
27、在c++中,系统通过try块和异常处理构成异常机制,通过catch语句来捕捉异常,并执行异常处理,通过throw语句抛出异常。

	double m, n;
	cin >> m >> n; //输入1 0
	try {
		cout << "before dividing." << endl;
		if (n == 0)
			throw -1; //抛出int类型异常,用于后面的catch捕获
		else
			cout << m / n << endl;
		cout << "after dividing." << endl;
	}
	catch (double d) {
		cout << "catch(double) " << d << endl;
	}
	catch (int e) { //捕获抛出的-1
		cout << "catch(int) " << e << endl;
	}
	cout << "finished" << endl;

include的使用
28、标准头文件(#include<>)在系统文件目录下查找,用户自定义头文件(#include “”)会依次在用户目录的C++安装目录和系统文件中查找。

原文地址:https://www.cnblogs.com/wanghuaijun/p/13546459.html