1、静态变量的初始值为什么是0;
答:全局变量和静态变量都在静态数据区,他们是在main函数之前就已经创建了,在main函数结束后,才销毁,在代码中根本没有机会初始化他们(万一在函数中使用,他们的值就有可能是随机数,而且在你不赋值的情况下,一直是原来那个值),于是语言及其实现就提供了一个默认的全局初始化器0。
2.什么是初始化,什么是赋值:
答:初始化是在对象(变量)创建的同时,而赋值是在对象创建后。
3.简单的编译和运行发生什么()
答:预处理:预处理伪指令、类类型的定义、外部对象的声明、函数原型、标识符、各种修饰符号(const,static,volatile,mutable)和类成员的访问说明符(public ,private,protect);
运行时:容器的越界,虚函数动态决议、函数的动态链接、动态内存分配、异常处理、RTTI等。
4.NULL是什么?为什么用它初始化指针
答:NULL就是#define NULL ((void*)0) 就是将将0这个数字,强转成无类型的地址。
void* 类型的指针是一个合法的指针,但不是一个有效的指针。1个NULL的指针,是一个合法指针,但不是一个有效指针。
c中void*和其他类型之间是可以互相转化的,但是c++中,任何类型可以转void* 但是void*不可以转成其他的类型。
5、强制转换是不是改变了原来的类型和值?
答:不是,c和c++不支持两个不同类型的元素运算,除非,隐士的类型转换、强制转换、定义运算符重载函数。
隐式转换:
类型的转换不是改变原来的类型和值,而是生成了一个新的临时变元。他的类型为目标类型。
6.写代码技巧(提高效率的作用)
1.在if else中,尽量把发生概率大的写在前面。
2.在多重循环中,如果有可能,将最长的循环放在最内层,最短的循环放在最外层,这样子就能减少cpu的跨切循环次数。优化代码。
3.&& 中,尽量把易错的放在最前面,||中把正确的放在最前面。
4.如果循环很大,判断次数多。就把判断放在最外面。
7.c++中传指针和传&的区别
答:引用的创建和销毁,不会调用对象的构造和析构函数。
指针,在某写角度看,相当于值传递。
8.getchar()的返回值是什么
答:也许,用习惯了库中的函数,你就根本没有注意过库中的函数的返回值,那么现在先看看getchar()的返回值,他的返回值为int。
在写输入的时候,好多人会这样子写getchar() != EOF,那么为什么这样写,EOF又是什么,这就告诉你getchar()蹦到文件结束或发生读错误,他必须返回-1,为了区别其他字符,只好EOF定义为负数,他就是一个宏定义。
9.存储类型;extern,auto,static,register。
答:局部变量:默认加了auto,除非用了regist或static,register和auto,只能用于声明局部变量和局部常量,
全局函数默认的是static,
用register修饰的变量会被直接加载到cpu寄存器中,如果寄存器足以容纳下的话,把那些循环计数器直接加载到cpu的寄存器上,可以避免内存与寄存器频繁的数据交换,因此提高效率。但是现在的编译器会自动的吧那些频率高、体积较小的变量放入cpu寄存器中,因此程序员就不用写register。
10.断言,你知道多少。
答。断言是个宏而不是一个函数,只在debug版本下,起作用,在release不起作用。当你调用断言失败的时候,我们内部其实调用的是库的abort()函数终止程序。
断言也不是万无一失的,那么memcpy的时候,你如果传入两个野指针,assert就是去了作用。
11.const提高函数的健壮性。
答:如果是指针传递,那么加上const就可以防止意外修改指针所指向的内存单元,起到保护作用;如果单纯的值传递,那么就没有比较加上const,因为就算修改里面的值,也不能修改堆栈上实参的值。
12.那些运算符不可以重载。
答:1 .运算符。
2 不能重载反引用类成员指针 “.*”
3 不能重载作用域“ ::”
4 不能重载三目运算符 “?:”
5 不能重载sizeof() typeid()
6 不能重载“#”和“##”