/:結果符號與數學一致,**異號為負**,同號為正。例:45 / -7 = -6(向零截斷)。%:結果符號**永遠與左操作數(被除數)相同**(「同左性」)。45 % -7 = 3、-45 % 7 = -3、-45 % -7 = -3。(a/b)*b + a%b == a,且 a/b 向零截斷。0x/0X 十六進制、0 八進制、**無前綴** 十進制。0,否則被視為八進制(如 010 == 8)。%[width][.precision][modifier]f/e/g
// 例:%-15.4Lf → 左對齊、寬度 15、小數點後 4 位、long double
width:最小輸出字符寬度,預設右對齊;- 旗標改為左對齊。precision:小數點後位數(f/e)或有效數字(g)。modifier:L 表示 long double,l 對 printf 無效(float 自動提升為 double)。#define PI 3.1415f)。#define PI 3.1415f —— 純文本替換,無類型檢查,不佔記憶體。const float Pi = 3.1415f; —— 有類型、有作用域、佔記憶體(除非被優化),編譯器禁止修改,**強烈推薦**。| 特性 | sizeof | strlen |
|---|---|---|
| 本質 | 編譯期運算符 | 運行期庫函數 |
| 單位 | 位元組 | 字符數(不含結束符 \0) |
| 參數 | 類型或表達式(類型需括號) | char* (以 \0 結尾) |
| 陣列參數 | **不退化**,得整個陣列大小 | 退化為指針,得字串長度 |
| 指針參數 | 得指針本身大小 (4/8 bytes) | 得字串長度 |
| 計算時機 | 編譯期(VLA 除外) | 運行期逐字符掃描 |
char str[20] = "0123456789"; // 10 字符 + \0
strlen(str); // 10
sizeof(str); // 20 (陣列大小)
char *ss = "0123456789";
sizeof(ss); // 4/8 (指針大小)
sizeof(*ss); // 1 (char 大小)
strlen(ss); // 10
char ss2[] = "0123456789";
sizeof(ss2); // 11 (含 \0)
strlen(ss2); // 10
int arr[100];
sizeof(arr); // 400 (100 * sizeof(int))
// strlen(arr); // 編譯錯誤:參數類型不匹配
void fun(char szPath[MAX_PATH]) // 相當於 void fun(char *szPath)
{
sizeof(szPath); // 4/8 (指針大小),非 MAX_PATH!
}
**口訣**:sizeof 看**棧上佔用空間**;陣列名進函數**退化為指針**,sizeof 只見指針大小。
編譯器按優先級自動轉換:
long double → 另一操作數轉為 long doubledouble → 轉為 doublefloat → 轉為 floatchar/short/bit-field → int (或 unsigned int)**經典坑**:
unsigned int ui = 1;
signed short s = -1; // 提升為 int -1
if (s > ui) printf("-1 > 1"); // 成立!-1 提升為 unsigned int 變巨大
if (s < 1) printf("-1 < 1"); // 也成立!比較時 1 為 int
letter = letter - 'A' + 'a';(僅限 ASCII 連續編碼環境,推薦用 tolower())。printf("%x", ch);。wchar_t、L"string"、%ls。float complex、double complex、long double complex。double complex z = 2.0 + 3.0*I;、creal(z)、cimag(z)。math.h):floor/ceil/fabs/log/log10/exp/sqrt/pow。struct O { int a,b,c,d,e,f,g,h; }; // 32 bytes (假設 int 4, 無填充)
O &r = *new O;
sizeof(O); // 32
sizeof r; // 32 (引用不佔空間,sizeof 引用 = sizeof 被引用對象)
指針無論指向靜態/堆疊/堆記憶體,sizeof(ptr) 永遠是指針大小。