咨询:两个C语言示例中最后一个变量初始化结果为何不一致
为什么示例1中最后一个变量能被scanf正确赋值,示例2却不行?
核心原因:变量初始化时的赋值覆盖
两个示例的关键差异在于哪个变量接收了scanf的返回值,以及这个赋值操作对输入值的覆盖:
示例1的执行逻辑
float a, b, c, average = scanf("%f %f %f", &a, &b, &c);
- 声明
a、b、c三个未初始化的float变量,同时声明average。 - 调用
scanf:读取3个输入值,分别写入a、b、c的内存地址(也就是&a、&b、&c指向的空间)。 scanf返回成功读取的参数个数(这里是3),将这个值赋值给average。- 后续代码重新给
average赋值为计算后的平均值,而a、b、c始终保留scanf写入的输入值,所以计算结果正确。
示例2的执行逻辑
float a, b, c = scanf("%f %f %f", &a, &b, &c);
- 声明
a、b两个未初始化的float变量,同时声明c并准备初始化。 - 调用
scanf:读取3个输入值,分别写入a、b、c的内存地址——这一步确实把第三个输入值写到了c的空间里。 scanf返回成功读取的参数个数(3),将这个整数值转换为float后赋值给c,直接覆盖了刚才scanf写入的第三个输入值。- 后续计算时,
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
相关产品推荐
相关产品推荐

