小程序/大思想——零碎知识点


本文整理网上看到、自己遇到的一些小程序体现出来的大问题以及一些巧妙的思想
一、
“只用赋值、加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标准格式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值