小程序/大思想——零碎知識點


本文整理網上看到、自己遇到的一些小程序體現出來的大問題以及一些巧妙的思想
一、
“只用賦值、加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標準格式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章