第二章 這不是Bug, 而是語言特性
無論在什麼時候,如果遇見了這樣一條語句malloc(strlen(str)); , 幾乎可以斷定它是錯誤的,malloc(strlen(str)+1);才對;
總結——進步是計算機軟件工程和編程語言設計藝術逐步發展的重要動因;
[cpp]
#include<stdio.h>
int main(int argc, char **argv)
{
const int one = 1;
int i = 1;
switch(i) {
case one: printf("1");
}
}
以上代碼編譯都不會通過,說明const 其實並不真正表示常量;
break 語句事實上跳出的是最近的那層循環語句或者switch 語句;
當sizeof 的操作數時個類型名時,兩邊必須加上括號,(這常常使人誤以為它是個函數),但操作數如果是變量則不必加括號;
有些專家建議在C語言中記牢兩個優先級就夠了:乘法和除法大於加法和減法,在設計其他的操作符時一律加上括號;
操作符的結合性:它是仲裁者,在幾個操作符具有相同優先級時決定先執行哪一個;
所有賦值符(包括符合賦值符)都具有右結合性;(又結合的也就兩類一類是賦值符一類是單目運算符);
[cpp]
#include<stdio.h>
#include<string.h>
char * f()
{
char buf[10];
strcpy(buf, "abcdefg");
return buf;
}
int main(int argc, char **argv)
{
printf("%s",f());
}
以上代碼打印不出預計值,因為buf是局部變量,函數結束時,由於該變量已被銷毀,誰也不知道這個指針所指向的地址的內容是什麼;
摘自 CodeBlog