C Day 26

变量各有归属,
赋值才更新原值

今天继续学习 C 函数,区分不同函数的局部变量,观察修改形参后原变量是否变化,再通过返回值和赋值完成更新。

课前复习:两个 void 的位置

复习时把两个 void 的含义写反,订正为函数名前的 void 表示不返回值,括号中的 void 表示不接收参数。后续能够正确说明:void change_number(int value) 不返回值,但会接收一个整数参数。

同名变量,也可以彼此独立

在 show_number 和 main 中分别声明 number。它们属于不同函数,是两个独立的局部变量;作用域说明可以在哪些位置使用这个变量名。

void show_number(void)
{
    int number = 99;
    printf("函数中 = %d\n", number);
}

// main 中另有 int number = 10;
// 调用前 = 10
// 函数中 = 99
// 调用后 = 10

先预测再运行,分别验证函数内使用 20 和 99 的两组结果:10、20、10,以及 10、99、10。两次均正常退出,代码为 0。

按值传递:形参接收一份值的副本

void change_number(int value)
{
    printf("修改前的形参 = %d\n", value);
    value = value + 5;
    printf("修改后的形参 = %d\n", value);
}

main 中的 number 为 10。调用 change_number(number) 时,把这个值复制给形参 value;value 加到 15,只改变它自己的值,main 的 number 仍为 10。四行预测与实际输出一致,运行正常退出。

返回结果,再由赋值更新变量

int add_five(int value)
{
    value = value + 5;
    return value;
}

// main 中通过赋值使用返回值
number = add_five(number);

先计算右侧:number 当前的 10 传给 value,函数返回 15;再由左侧 number 接收,覆盖原来的 10。真正更新原变量的是调用处的赋值。

分别重新运行两种写法:带 number = 时最后输出 15;单独写 add_five(number); 时函数仍执行,但返回值未被使用,number 保持 10。两次预测正确,退出代码均为 0,最终恢复了带赋值的写法。

固定输出文字“接收返回值后”不会改变程序行为。判断有没有接收结果,要看实际的赋值语句。

独立练习:连续调用翻倍函数

day26.c · 独立函数与调用片段
int double_value(int value)
{
    value = value * 2;
    return value;
}

// main 中的三次调用
int score = 6;
double_value(score);
printf("第一次后 = %d\n", score);
score = double_value(score);
printf("第二次后 = %d\n", score);
score = double_value(score);
printf("第三次后 = %d\n", score);

独立编写 double_value,先将形参乘以 2,再返回结果。三行预测为 6、12、24:第一次不接收返回值;第二次接收 12;第三次传入已经更新的 12,再接收 24。实际运行全部一致,退出代码为 0。

订正:说清复制、返回与赋值

最初用“没有将形参传回 main”解释原变量不变,还需要说明形参是副本,以及返回值有没有被调用处使用。补题中,number 为 10,执行 int result = add_five(number); 后,正确预测 number 仍为 10、result 为 15。

解释时把 add_five 的形参名称说成 number,已订正为 value。返回的 15 由 result 接收,没有给 number 重新赋值。接下来继续练习准确使用变量名,完整追踪数据流。

下一课学习函数声明与函数之间调用,区分声明、定义和调用,并逐步追踪调用与返回路线。