1.編輯器設計者的金科玉律:效率(幾乎)就是一切
2.閱讀ANSIC標准 , 尋找樂趣和裨益
具體的ANSI C標准的規定我都不說了,從中看出 char * 類型是可以作為參數專遞的,但是char** 是不行的,所以我們
傳遞多維數組的時候要表明確前n-1維的下標
3.容易混亂的const
[cpp]
int main(int argc, char* argv[])
{
//定義基本類型的const變量,const 位置在哪兒都可以
const int x = 2,y = 3; //兩個常量
//定義一個非const變量
int z = 3; //一個普通變量
//定義一個指向常的指針
const int* pc = &x; //指向常量的指針
//定義一個常指針
int* const cp = &z; //常指針
//定義一個非const指針
int* pp = &z; //int 型指針
pc = &z; //可以,pc是一個指向常量的指針,不能通過該指針去修改指針所指向的內存空間的值,但是,該指針可以指向別的變量
// *pc = 10; //不可以,*pc所指向的地址為const變量,其值不可更改 pc是一個指向常量的指針,不能通過該指針去修改指針所指向的內存空間的值
pc = pp; //可以,pc為指針,其值可被改變 pc是一個指向常量的指針,pp是一個普通指針,用一個普通指針給一個指向常量的指針賦值是可以的
// pp = pc; //用一個指向常量的指針,賦值給一個普通指針,不可以。如果可以,那麼就可以通過普通的指針去修改內存的值
*cp = x; //可以,通過常指針去修改指針所指向變量的值是可以的
// cp = &x; //不可以,cp為常指針,指針的值不能被修改,給常指針賦值是錯誤的
// pp = &x; //不可以,pp是非const指針,原則上來講給它賦值是可以的,在不同的編譯器下有不同的結果
// pp = pc; //不可以,指向常量的指針不能賦值給一個普通的指針
pp = cp; //可以,常指針可以賦值給一個普通指針
const int * const pp = &a; //雙const 既保護指針又保護內存變量
return 0;
}
4.ASINC 手冊重新編寫了有關內容整型升級和尋常算數轉換
注意: #define TOTAL_ELEMENTS ( int )( sizeof(array) / sizeof(array[0]) ) 必須加上(int)強制轉換,不然運算的結果是個 unsigned int 類型,在程序中與有符號數運算時會發生意想不到結果
5. 錯誤斷言
無論什麼時候遇見 malloc(strlen(str)) 都是錯誤的
而 malloc(strlen(str) + 1) 是正確的
因為字符串處理包含了一個額外的空間,用於容納字符串結尾的‘\0’
6. 一個‘L’的NUL 和 兩個 ‘L’的NULL
7. switch 中case 後面不用break 97%都是錯誤的,而且default這單詞如果寫錯的話,編譯器是不檢測的。
8. 在字符串數組在初始化的時候,如果不小心漏掉了一個逗號,編譯器不會發出錯誤信息,而是悄無聲息地把兩個字符串合起來
[cpp]
#include<stdio.h>
#include<string.h>
#define TOTAL_ELEMENTS (int)(sizeof(str)/sizeof(str[0]))
int main()
{
char *str[] = {
"aaa",
"bbb",
"ccc",
"ddd"
"eee",
};
printf("the length of the array is %d\n",TOTAL_ELEMENTS);
for(int i = 0; i < TOTAL_ELEMENTS; i++)
puts(str[i]);
return 1;
}
結果:
9. 使一段代碼第一次執行的行為與以後執行時間不同(函數中申請靜態變量)
10. i = 1, 2; 的結果是i 為多少呢?
賦值運算符的優先級高於逗號,所以 實際情況為: (i = 1), 2 , 所以i 最終的值為1
而 i = (1 ,2);的結果i 為2;
11.計算的次序