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关键字的区别?
只有一个区别:struct内默认的访问标号是public,class内默认的访问标号是private。没有其他区别的,别被面试官吓着。