You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:两个C语言示例中最后一个变量初始化结果为何不一致

为什么示例1中最后一个变量能被scanf正确赋值,示例2却不行?

核心原因:变量初始化时的赋值覆盖

两个示例的关键差异在于哪个变量接收了scanf的返回值,以及这个赋值操作对输入值的覆盖:

示例1的执行逻辑

float a, b, c, average = scanf("%f %f %f", &a, &b, &c);
  1. 声明a、b、c三个未初始化的float变量,同时声明average。
  2. 调用scanf:读取3个输入值,分别写入a、b、c的内存地址(也就是&a、&b、&c指向的空间)。
  3. scanf返回成功读取的参数个数(这里是3),将这个值赋值给average。
  4. 后续代码重新给average赋值为计算后的平均值,而a、b、c始终保留scanf写入的输入值,所以计算结果正确。

示例2的执行逻辑

float a, b, c = scanf("%f %f %f", &a, &b, &c);
  1. 声明a、b两个未初始化的float变量,同时声明c并准备初始化。
  2. 调用scanf:读取3个输入值,分别写入a、b、c的内存地址——这一步确实把第三个输入值写到了c的空间里。
  3. scanf返回成功读取的参数个数(3),将这个整数值转换为float后赋值给c,直接覆盖了刚才scanf写入的第三个输入值。
  4. 后续计算时,c的值是3.0f而非你输入的数值,自然得到错误结果。

关于你提到的“添加第四个变量后恢复正常”

当你在同一行声明第四个未赋值的average时,代码就变成了示例1的形式:scanf的返回值被赋值给average而非c,c不会被覆盖,因此能保留scanf写入的输入值,计算结果也就正确了。

额外提醒

虽然示例1能正常工作,但写法非常不规范:average一开始被赋值为scanf的返回值(整数),随后又被覆盖,完全是多余的操作。正确的写法应该是分开处理scanf的调用和变量声明:

#include <stdio.h>

int main(){
    float a, b, c;
    // 检查scanf的返回值,确保输入成功
    if (scanf("%f %f %f", &a, &b, &c) != 3) {
        printf("输入错误!\n");
        return 1;
    }

    float average = (a * 2 + b * 3 + c * 5) / 10;
    printf("AVERAGE = %.1f\n", average);

    return 0;
}

内容的提问来源于stack exchange,提问作者Leônidas Araújo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:05:25