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