任何人都可以享受编程。
1.计算机日期
关于time_t,什么时候它会到达尽头,重新回到开始呢?
#include<stdio.h>
#include<time.h>
int main(){
time_t biggest=0x7FFFFFFF;
printf("biggest = %s \n",asctime(gmtime(&biggest)));
return 0;
}
2.编译器设计者的金科玉律:效率(几乎)就是一切
编译器的效率包括两个方面:运行效率(代码的运行效率)和编译效率(产生可执行代码的速度)。除了一些开发和学习环境之外,运行效率起决定性作用。(保证结果正确的前提下)
3.容易混淆的const
关键字const不能把变量变成常量!在一个符号前加上const限定符只是表示这个符号不能被赋值。也就是说它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚至是外部)的方法来修改这个值。const最有用之处就是用它来限定函数的形参,这样该函数将不会修改实参指针所指的数据,但其他的函数却可能修改它。这也许就是C和C++中const最一般的方法。
const可以用在数据上,如:const int limit=10;
在等式两边加上指针就有一定难度了:
const int *limitp=&limit;
int i=27;
limitp=&i;
这个代码表示limitp是一个指向常量整型的指针。这个指针不能用于修改这个整型数,但是在任何时候,这个指针本身的值却可以变。这样,它就指向了不同的地址,对它进行解除引用操作时会得到一个不同的值。
4.一个微妙的bug
sizeof()的返回类型是无符号数(unsigned int类型)。
int array[]={23,34,12,17,204,99,16};
#define TOTAL_ELEMENTS(sizeof(array)/sizeof(array[0])
main()
{
int d=-1,x;
/*....*/
if(d<=TOTAL_ELEMENTS-2)
x=array[d+1];
/*....*/
}
修改为:
if(d<=(int)TOTAL_ELEMENTS-2)
对无符号类型的建议:
尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄,国债)而用它来表示数量。
尽量使用像int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(如-1被翻译为非常大的正数)
只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。