作者EdisonX (閉上眼的魚)
看板C_and_CPP
標題[問題] C語言列舉、指標、標準問題 (x6)
時間Sun Sep 16 22:30:11 2012
這陣子接了小家教,講義從頭到尾自己編,編的過程有些概念其實不是很確定,
依慣性作法,家教結束後把問題擠在一起一次提出,
請各位版友不吝指教。
------
1. 列舉(enum)之變數能否以常數設初始值?
enum E1{x, y, z};
enum E1 var = 0;
我翻以前的書是寫不行,但手邊 compiler 是都可以過。
另外想請教 C++ 下面這兩個 enum 是不是合法的 (它在 C 是不合法的)
enum E1{x,y,z};
enum E2{a,b,x};
關鍵在於 x 被兩個 enum 當作列舉元,C 沒有 :: 概念,但 C++ 有,
不知上面這段是否合法?
2. 針對 C string library 而言,諸如 strchr, strstr, strtok... etc,
標準裡是否已有明確規定,函式必須對輸入引數為 NULL 時做處理避免發生錯誤?
3. bsearch 為 stdlib 之二分搜尋法,但二分搜尋法會隨著問題不同導致寫法不同,
請教若鍵值存在時,
C Stdlib library 裡之 bsearch 是否有保證找到的會是第一個 key-value?
4. NULL 本身做「取址」會怎樣?
這是在寫指標範例時,為了清楚表達寫下的 code ,
但細思,若有一個步驟為對 NULL 做取址,是否合法?
int *Ptr = NULL;
printf(" Ptr = %08x\n", Ptr);
printf("&Ptr = %08x\n", &Ptr);
printf("*Ptr = %08x\n", *Ptr);
這點不知道在標準裡面有沒有明文規定?還是讓 compiler 自己搞?
5. 有沒有 float32 / float64 之資料型態?
C99 後多了 stdint.h ,裡面有 uint32_t 等資料型態,
針對浮點數,是否只能以 typedef 方式去做而已?
typedef 的話我想不透有沒有辦法轉交由 macro 判定,
不知有沒有人有經驗?
6. 一律以動態配置方式建立實體資料
這個有點像是資料結構的問題了。假定為 array。
若是有含「交換」動作的 sort algorithm ,
若資料內容是一份屬性不少的 struct ,
在做 swap 時會花不少時間。
假設欲建立起 struct Data array[N],
個人比較推用下面這種方式 < 只是示意而已,malloc 部份會做優化 >
// 先建立 N 個指標
struct Data** Array = \
(struct Data**)malloc(sizeof(struct Data*) * N );
// 每個指標再用 malloc 做實體配置
for(i=0; i<N; ++i) {
Arr[i] = (struct Data*)malloc(sizeof(struct Data));
// Read Data
}
好處是到時候要交換時只要對指標做交換,不用對整份 struct 做交換。
壞處當然也不少,像是會平白無故多了 pointer 佔空間、coding 複雜不易維護。
針對這種設計模式,我想問的是,在做「尋訪」時,會由於是 pointer to pointer
所以讀寫時間會比一般的直接寫入還慢嗎? 直覺是會,在此做確認。
( 我是覺得這種差異上的成本應該是比不上 swap 的成本來得高 )
------
問題有點多,煩請不吝賜教,小弟感激不盡 !!
--
「自從我學了 C# , 人都變聰明 , 考試都考一百分」
「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」
「自從我學了 Java , 明顯變壯 , 個子也變高了 」
「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161
推 stupid0319:NULL = -1 09/16 23:14
推 dirkc:針對問題2,應該是沒有,標準定義了功能面,至於實做版本有沒有 09/16 23:18
→ dirkc:也很難說,剛剛網路上查了一個實作版本就沒有檢查 09/16 23:19
→ EdisonX:謝謝 d 大的回答 :) @s~ 大 : NULL=-1 指的是?小弟不解. 09/16 23:29
→ BombCat:我以為NULL是為0的巨集常數耶,定義在stddef.h 09/17 04:47
→ BlazarArc:1. enum 在c++我記得沒有scope? 會重複 literal 09/17 09:35
→ BlazarArc:所以c++11才有enum class 09/17 09:35