本文整理网上看到、自己遇到的一些小程序体现出来的大问题以及一些巧妙的思想
一、
“只用赋值、加1、循环三个操作实现一个减1的运算。”
template <typename T> T MOne(T a) { T i = 0; for (i; (i + 1) != a; i++) { } return i; }
http://topic.csdn.net/u/20110905/16/d15be554-18f0-4244-af38-f54f16ab1642.html
二、链表删除头结点问题
free(head); head = head -> next;这段代码本身是错误的,但很有可能能够编译通过并运行,但是确实存在致命错误
另,free的含义:堆区的这段空间标记为可以回收,当系统需要的时候会被分配存其他数据,重新分配之前其内容还是结点信息,
但不知道什么时候就会被系统回收,所以其数据是不可靠的,对其操作时危险的
p = head -> next; free(head); head = p;
指针指向的内存被回收但指针依旧存在于栈区,如果不立即使用,为防止其变为野指针(迷途指针)通常释放之后要赋值NULL(空指针)
三、union表示可以有多种方法来看待这个数据类型
其内的各成员是互斥的
windows XP 32位系统,X86平台下:
union { int i; char x[2]; }a;
int main() { a.x[0]=10; a.x[1]=1; printf("%d\n",a.i); return 0; }结果为266
栈区由高地址向低地址扩展:
高地址 ---------00001010
低地址----------00000001
(100001010)=(266)
四、
1.不使用库函数将整数转换成字符串
2.不使用sizeof求整型长度
3.不使用中间变量实现strlen
五、printf函数中,float会自动转换成double。对于
printf("%f",5);
32位平台整型占4个字节,但float被视为double,输出的时候将读取8个字节,导致访问越界
单精度与双精度的区别:
1、对于常量来说,单精度型与双精度型没区别,因为电脑没办法区别是哪种。所以在标准C下浮点常量都占8个字节。2、对于变量来说,单精度型与双精度型变量所占内在空间不同(存放的数据大小不一样),在标准C下,单精度型占4个字节,双精度型占8个字节。
浮点数的表示:S+E+M(符号位+阶数+尾数),详见《单双精度浮点数的IEEE标准格式》