看板 C_and_CPP 關於我們 聯絡資訊
由於板工希望十三誡能夠在教育新手的同時也能避免夾帶錯誤的觀念, 所以大膽增修已經好久沒修的十三誡。 增修的同時,板工希望能把C99/C11/C++11/C++14的一些觀念也附上去。 例如for loop改用C99可以支援的語法 for (int a = ...){} (畢竟現在都2016了,不能老是用ANSI C) 希望各位板友能夠踴躍提供增修意見,感謝。 PS: 不要忘記我們還有徵文活動喔 *_< ============================================================= 01. 你不可以使用尚未給予適當初值的變數 錯誤例子: int accumulate(int max) /* 從 1 累加到 max,傳回結果 */ { int sum; /* 未給予初值的區域變數,其內容值是垃圾 */ for (int num = 1; num <= max; num++) { sum += num; } return sum; } 正確例子: int accumulate(int max) { int sum = 0; /* 正確的賦予適當的初值 */ for (int num = 1; num <= max; num++) { sum += num; } return sum; } 備註: 根據C Standard,擁有static storage duration的變數, 例如全域變數(global variable)或帶有static修飾字者, 其初值(宣告的時候若是沒有另外設初值的情況)為定值(最自然的初值就是0)。 (但是有些MCU 編譯器可能不理會這個規定,所以還是請養成設定初值的好習慣) 補充資料: - 精華區z->5->1->1->1 - C11 Standard 5.1.2, 6.2.4, 6.7.9 -- 個人網頁:http://gnitnaw.github.io/ 以後在C_and_CPP或LinuxDev發表的文章都會放一份在這邊。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.214.44 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1462982483.A.F36.html ※ 編輯: wtchen (90.41.214.44), 05/12/2016 00:14:17
askacis: 這樣的變數會被放到BSS Section,所以如果系統初始沒有 05/12 11:02
askacis: 把BSS section清0,自然就會是亂數,寫MCU沒有OS,所以 05/12 11:02
askacis: 要靠自己把BSS section清0,Linux的話會給zero pages 05/12 11:04
loveflames: BSS是linux特有,windows沒有這個section 05/12 11:04
askacis: 因為板主拿MCU當例子,現在多數主流MCU IDE都跑ELF格式~ 05/12 11:17
HolyBugTw: 有個問題,如果char str[10], 後面用了strcpy去填值 05/12 12:03
askacis: 當然我對Windows不熟,不過翻了一下PE的規格書,似乎也是 05/12 12:03
HolyBugTw: 那str有沒有事先memset有差嗎?我是會要求還是得作 05/12 12:03
descent: bss 在 dos 時代也有, 怎麼會是 linux 特有, 05/12 12:29
descent: 可以反組譯看 asm 檔案, 即可確認 bss 的存在。 05/12 12:29
loveflames: dos有我倒是不知道,windows的PE沒有就是 05/12 12:33
askacis: PE規則書,請參考 http://goo.gl/tZNC7Z 05/12 13:24
loveflames: 以前怎麼試都沒有BSS section,不知道是不是編譯器問 05/12 14:34
loveflames: 題 05/12 14:34
※ 編輯: wtchen (90.41.214.44), 05/12/2016 17:41:08
wtchen: char str 如果後面用strcpy給值那有沒設0應該沒差 05/12 17:43
wtchen: 不過C99後char可以設初值不用memset 05/12 17:43
johnjohnlin: 可以順便加入不同初始的意義嗎? 05/12 17:43
wtchen: 板工不清楚MCU的狀況,了解的大概就跟askcis差不多 05/12 17:44
johnjohnlin: 像是 zero, value, default 之類的? 05/12 17:44
wtchen: 不同初始的意義是指? 05/12 17:47
wtchen: OS怎麼處理的嗎?那要另外寫補充資料 05/12 17:47
wtchen: 板工只熟Linux....Win系列要有人寫 05/12 17:47
wtchen: 像是 zero, value, default 之類的? 不懂... 05/12 17:54
※ 編輯: wtchen (86.209.153.222), 05/12/2016 19:23:11 ※ 編輯: wtchen (86.209.153.222), 05/13/2016 16:11:46
LPH66: en.cppreference.com/w/cpp/language/initialization 05/13 20:08
LPH66: johnjohnlin 講的是這裡面列的那六種吧 05/13 20:08
wtchen: 這要另外寫一篇.... 05/13 20:13
wtchen: 板上有高手要寫嗎?我預計要寫的文章差不多快排到年底了 05/13 22:12