本文整理网上看到、自己遇到的一些小程序体现出来的大问题以及一些巧妙的思想
一、
“只用赋值、加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;
这段代码本身是错误的,但很有可能能够编译通过并运行,但是确实存在致命错误
假设head定义如下:
head=(node*)malloc(sizeof(node));
我们知道,指针head位于非堆区(比如栈区),而右侧的空间位于堆区
另,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
10的二进制表示为1010,1的二进制表示为0001,且char类型占一个字节
栈区由高地址向低地址扩展:
高地址 ---------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标准格式》