經典困惑代碼:
int max(int x, int y) {
int z = (x > y) ? x : y;
return z;
}
int main() {
int a = 2, b = 3;
int c = max(a, b); // c=3
// 問:x、y 是多少?a、b 變了嗎?
}
max(a, b) 時,實參 a、b 的值被複製 給形參 x、y。c=max(a,b), a=2,b=3 → 形參 x=2, y=3,返回 z=3,c=3。a、b 不變。a=2,b=3, x=10,y=15 → 這裡 x、y 是 main 的局部變量,與 max 的形參無任何關係。max 內部 x、y 仍為 2、3。main 的 x、y 保持 10、15。a,b 未賦值, x=10,y=15 → a、b 為未初始化局部變量,值不確定(垃圾值)。max 接收垃圾值,行為未定義。x、y 仍為 10、15。c 等於誰? → c = max函數返回值 = z(即 x、y 中較大者)。void swap(int *a, int *b) { // 傳遞地址
int t = *a; *a = *b; *b = t;
}
int main() {
int x = 10, y = 20;
swap(&x, &y); // 傳遞變量地址
// 此時 x=20, y=10
}
本質仍是值傳遞(傳遞指針值),但通過解引用 *ptr 可修改原變量。
| 變量類型 | 作用域 | 生命週期 | 示例 |
|---|---|---|---|
| 函數形參 | 函數內部 | 函數調用期間 | max(int x, int y) 中的 x,y |
| 函數局部變量 | 塊內({}) | 塊執行期間 | int z 在 max 內 |
| 主函數局部變量 | main 內部 | 程序運行全程 | int a,b 在 main 內 |
-Wall -Wextra / /W4),捕獲未初始化變量使用。