1、为什么istream类型的对象(例如std::cin对象)可以用作循环测试条件?

#include <iostream>
int main() {
    int sum = 0, value;
    while (std::cin >> value)
        sum += value;
    std::cout << "Sum is " << sum << std:endl;
    return 0;
}

这里涉及2个知识点:

(1)输入操作符 >> 返回的是它的左操作数,std:: cin >> value 返回了 std::cin 对象自己。

(2)问题成了 while (std::cin) ,std::cin是istream类型,当它用作测试条件时,返回流的状态。流是有效的,则测试成功,否则失败。

当遇到EOF,或无效输入(例如类型不匹配)时,流的状态变为无效。

2、在C++中,std::endl 有刷新输出缓冲区的作用。没必要调用 cout.flush();

3、程序员常常利用 edit-compile-debug 循环,利用编译器的错误检测功能排查程序的错误。

4、将unsigned int类型赋值给 unsigned char会发生什么?

unsigned char 类型的取值范围是 0 ~ 255 (共256个值)。而unsigned int 比 unsigned char表示的范围更大,例如可以表示 336.

unsigned char a;
unsigned int b = 336;
a = b;
std::cout << "a = " << a << std::endl;

结果输出是多少? 答案是 a = 80。 程序执行的过程是:编译器对超出范围的值执行了模运算,unsigned char类型可以表示256个数,因此 336 % 256 = 80。

其他不同长度的unsigned类型的赋值操作都是模运算法则

当把负数赋值给一个unsigned类型的时候(在C++中这是合法操作),也是上面描述的模运算法则

但是,对于signed类型的算数类型,不同的编译器有不同的处理方式。一般情况,处理方式类似于unsigned。

5、少用float,多用double。

6、变量定义跟变量声明有什么区别?

区别变量的定义与声明非常重要,由extern关键字和变量是否初始化共同决定的。变量定义要分配存储空间。变量声明不分配存储空间,它引用一个已经定义的变量(可能在另一个文件中)。假如以下变量都是全局变量,规则如下:

1、没有extern。例如,“int var;” 和 “int var = 100”, 这是变量定义。

2、有extern, 没有初始化。“extern int var;”, 这是变量声明。

3、有extern,也有初始化。 “extern int var = 12”, 这又变成了变量定义。

对于const变量而言,规则如下:

1、所有const变量的定义必须初始化(用extern关键字将它变成声明,怎么变见后面规则)。

2、const变量只能在同一个文件中使用(类似于C语言中的static变量)

const int a;  //错误:没有初始化
const int b = 100; //正确,这是变量定义,成为局部变量
extern const int aa;  //正确,这是变量声明
extern const int bb = 100; // 正确,这是变量定义,可以在其他文件中使用。

7、magic number(魔数)的含义: 程序中出现了一个数值,无法知道它的含义,就好像这个数字是魔术变出来的一样。

写程序要尽量避免制造魔数。

8、enum类型中的成员可以用相同的数值吗?

可以。例如:

enum fruit {
apple = 1, orange, banana = 1, watermelon
};

enum类型不是int类型,所以不能用 int 类型初始化 enum。


enum Points { point2d = 2, point2w, pint3d = 3, point3w };
Points a = point3d; //正确
Points b = 2; //错误,不能用int初始化enum类型
b = 2; //错误,也不能用int给enum赋值
Points c;
c = a; //正确
c = point3w; //正确


9、struct与class关键字的区别

区别:1)struct内默认的访问标号是public,class内默认的访问标号是private

2)用struct关键字声明的结构体中,内存布局与C语言兼容。用class声明做不到

10、不用中间变量交换两个变量

a = a + b; b = a - b; a = a - b;

或:

a = a ^ b;   b = a ^ b;  a = a ^ b;

11、特殊用法

int i = i;  等价于  int i;

float a = 1.0f;   cout << (int&)a << endl; //直接把a当作int输出,无转换类型

在C++中,无论是赋值、传参数、返回数值,只要有任何类型不匹配的情况,发生的事情都是:1、先转换成同一个类型  2、再传递或使用

float b = 10f;  int a = b;



面试中C/C++考试经常考察的知识点:赋值语句、sizeof、类型转换、const