#if 0 ... #endif 替代 /* */,避免嵌套註釋問題。#include 文本替換,#define 定義常量/宏(類似 Java final static)。#include 引入,單一拷貝易維護。&arr 雖合法但多餘。gets 讀行丟棄 \n 加 \0;puts 輸出加 \n。getchar 返回 int(含 EOF),putchar 輸出字符碼。編輯 → 預處理 → 編譯(.o) → 鏈接(a.out) → 加載 → 運行 UNIX: cc welcome.c → a.out
| 類型 | 最小範圍 | 備註 |
|---|---|---|
| char | 0~127 | 有符號性由實現定義 |
| signed char | -127~127 | |
| unsigned char | 0~255 | |
| short | -32767~32767 | ≥16位 |
| unsigned short | 0~65535 | |
| int | -32767~32767 | ≥16位,通常=機器字長 |
| unsigned int | 0~65535 | |
| long | -2147483647~2147483647 | ≥32位 |
| unsigned long | 0~4294967295 |
limits.h 定義 CHAR_BIT, SCHAR_MIN/MAX, UCHAR_MAX, SHRT_MIN/MAX, USHRT_MAX, INT_MIN/MAX, UINT_MAX, LONG_MIN/MAX, ULONG_MAX。
#if ('\x80' < 0)
#define CHAR_MIN SCHAR_MIN
#define CHAR_MAX SCHAR_MAX
#else
#define CHAR_MIN 0
#define CHAR_MAX UCHAR_MAX
#endif
int → long → unsigned long(取最小容納者)。int → unsigned int → long → unsigned long。int;L'x' 為寬字符。long double ≥ double ≥ float,最小範圍 10±37。常量默認 double,F/f→float,L/l→long double。
\0 結尾,內部不可含 \0。"" 為空串(含 1 字節 \0)。int *a, b, c; // 僅 a 是指針,b/c 是 int
char *msg = "Hello"; // 初始化 msg 本身,非 *msg
external(跨文件可見)、internal(文件內可見)、none(唯一實體)。static 將 external 改為 internal;extern 聲明 external。char ch; while((ch=getchar())!=EOF) 錯誤!EOF 需更多位,getchar 返回 int。a[2*(y-6*f(x))] = a[2*(y-6*f(x))] + 1; // 下標計算兩次
a[2*(y-6*f(x))] += 1; // 僅計算一次,效率更高
sizeof 1 → 4(int),sizeof (char) → 1。a = a++ → 1;b = ++b → 2。a = a++ / b = ++b 均為未定義行為(UB),編譯器結果不一致。c + --c:求值順序未規定,結果不可移植。expr1, expr2, expr3 左→右求值,整體值為最後表達式值。
arr[i] ≡ *(arr + i),編譯器統一轉換為指針形式。
. 用於變量,-> 用於指針。++p->len ≡ ++(p->len);*p->str++ 先取值後 str++;*p++->str 先取值後 p++。0 為假,非 0 為真。flag 只能為 0/1 時 if(flag) 等價 if(flag==TRUE);任意整數時需顯式 if(flag != 0)。
*p = 20; // 左值:指定修改位置
a = *p; // 右值:提取位置值
long c = a * (long)b; // 強轉一操作數避免 16位機溢出
a*b + c*d 三乘法順序不定)。f()+g()+h() 中 f,g,h 調用順序不定。&& || ? : , 強制左→右求值。a = b = c → 右結合 → a = (b = c)。*p++ → *(p++)(後綴 ++ 優先級高於 *)。x > y ? 100 : ++y > 2 ? 20 : 30 → 右結合 → x > y ? 100 : (++y > 2 ? 20 : 30)。條件運算符強制先算條件,x>y 為真則整體為 100,內層不求值(無副作用)。unsigned int reverse_bits(unsigned int value) {
unsigned int ans = 0;
for (unsigned int i = 1; i != 0; i <<= 1) {
ans <<= 1;
if (value & 1) ans |= 1;
value >>= 1;
}
return ans;
}
// 25 (0x00000019) → 2550136832 (0x98000000)
用 i != 0 控制循環次數,自適應機器字長,避免硬編碼 32/64。