楼主:
wtchen (没有存在感的人)
2016-05-12 00:01:20由于板工希望十三诫能够在教育新手的同时也能避免夹带错误的观念,
所以大胆增修已经好久没修的十三诫。
增修的同时,板工希望能把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
作者:
askacis (ASKA)
2016-05-12 11:02:00这样的变量会被放到BSS Section,所以如果系统初始没有把BSS section清0,自然就会是乱数,写MCU没有OS,所以要靠自己把BSS section清0,Linux的话会给zero pages
BSS是linux特有,windows没有这个section
作者:
askacis (ASKA)
2016-05-12 11:17:00因为板主拿MCU当例子,现在多数主流MCU IDE都跑ELF格式~
有个问题,如果char str[10], 后面用了strcpy去填值
作者:
askacis (ASKA)
2016-05-12 12:03:00当然我对Windows不熟,不过翻了一下PE的规格书,似乎也是
作者:
descent (“雄辩是银,沉默是金”)
2016-05-12 12:29:00bss 在 dos 时代也有, 怎么会是 linux 特有,可以反组译看 asm 档案, 即可确认 bss 的存在。
dos有我倒是不知道,windows的PE没有就是
作者:
askacis (ASKA)
2016-05-12 13:24:00以前怎么试都没有BSS section,不知道是不是编译器问题
楼主:
wtchen (没有存在感的人)
2016-05-12 17:43:00char str 如果后面用strcpy给值那有没设0应该没差不过C99后char可以设初值不用memset
楼主:
wtchen (没有存在感的人)
2016-05-12 17:44:00板工不清楚MCU的状况,了解的大概就跟askcis差不多
像是 zero, value, default 之类的?
楼主:
wtchen (没有存在感的人)
2016-05-12 17:47:00不同初始的意义是指?OS怎么处理的吗?那要另外写补充资料板工只熟Linux....Win系列要有人写像是 zero, value, default 之类的? 不懂...
作者:
LPH66 (-6.2598534e+18f)
2016-05-13 20:08:00en.cppreference.com/w/cpp/language/initializationjohnjohnlin 讲的是这里面列的那六种吧
楼主:
wtchen (没有存在感的人)
2016-05-13 20:13:00这要另外写一篇....板上有高手要写吗?我预计要写的文章差不多快排到年底了