每天编程,很少整理自己对基础知识的认识。很多天天使用的东西,寻根究底问自己其实还是不太清楚。
今天开始每天做一些面试题,在这里整理自己的误区。
1、一般赋值语句
&& 逻辑与(结果为0或1*)
& 按位与
|| 逻辑或(结果为0或1*)
| 按位或
2、C++域操作符
C中不支持此操作符,含有这个操作符的代码以.c文件编译则提示符号错误;
C++中 类名::变量或函数 (类域)
::变量或函数 (全局域)
3、i++和++i的区别
int i=8;
printf("%d\n",-i++); //输出-8,i的值变为9
printf("%d\n",-i--); //输出-9 ,i的值变为8
这道题自己错在一个很奇葩的地方,第一次输出以后,我误以为i的值变成了-8++,变成-7。。。
4、i++与++i效率比较
1)考虑内建数据类型的情况,自增表达式的结果没有被使用,只是简单用于增加一员操作数,效率没有区别;
2)考虑自定义数据类型(类),前缀式(++i)可以返回对象的引用,而后缀式(i++)必须返回对象的值,在大对象时产生了较大的复制开销。优先选用前缀式。(++i返回对象的引用;i++总是要创建一个临时对象,在退出函数时还要销毁它,而且返回临时对象的值时还会调用其拷贝构造函数。)
5、条件比较语句的编程风格(与0比较)
布尔型变量flag if(flag)if(!flag)
整形value if(value==0) if(value!=0)
浮点型x if ((x>-EPSINON)&&(x<EPSINON)) if((x<-EPSINON)||(x>EPSINON)) ( 因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是 [-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下,具体的好像不确定的,和机器有关)
指针p if(p==NULL) if(p!=NULL) 尽管NULL和0的值相同,但两者意义不同。
哭。。。。写了半天忘记保存
10、标准头文件的结构
11、atexit 函数
exit调用这些注册函数的顺序与它们 登记时候的顺序相反。在atexit(f)调用之前被静态分配的对象的
析构函数将在f()的调用之后被调用。在一个atexit(f)调用之后建立的这种对象的析构函数将在f的调用之前被调用。