C语言代码输出异常值1717986918的成因排查求助
问题分析
1. 异常数值1717986918的本质
这个数值是将double类型的25.4(10英寸×2.54厘米/英寸)强制以int类型的二进制格式解析后得到的无意义垃圾值。
2. 导致异常的核心原因
你的代码存在两个关键错误:
格式符与数据类型不匹配:
inches是int类型,乘以2.54(double常量)后结果为double类型,但你用了%d格式符输出——%d是专门用于输出int类型的格式符,当你把double值传给%d时,编译器会把double的64位二进制表示按int的32位规则读取,从而得到完全不符合预期的数值。printf嵌套调用的逻辑错误:
你把第二个printf作为第一个printf的参数传入,导致执行顺序和参数传递完全混乱:- 程序会先执行嵌套的
printf("or %d centimeters\n", inches*2.54);,此时因为上述类型不匹配问题,先输出了错误的厘米数; - 然后把这个
printf的返回值(即成功输出的字符个数)作为第一个printf的参数,而第一个printf的格式字符串需要3个int参数(yards、feet、inches),你并未正确传递,你这里第一个输出恰好正确属于栈临时值巧合匹配的情况。
- 程序会先执行嵌套的
另外你的代码还有变量名语法错误:inches per foot和feet_per yard包含空格,C语言变量名不允许有空格,正确写法应为inches_per_foot和feet_per_yard。
3. 代码修正方案
拆分嵌套的printf调用,修正类型不匹配问题,同时修复变量名错误,还要注意计算总厘米数时需要用转换后的总英寸数:
#include <stdio.h> int main() { int inches = 0; int yards = 0; int feet = 0; const int inches_per_foot = 12; // 修正变量名,移除空格 const int feet_per_yard = 3; // 修正变量名,移除空格 printf("Enter a distance in inches: "); scanf("%d", &inches); feet = inches / inches_per_foot; yards = feet / feet_per_yard; feet %= feet_per_yard; int remaining_inches = inches % inches_per_foot; // 用单独变量存储剩余英寸,避免覆盖原始计算逻辑 printf("That is equivalent to %d yards %d feet and %d inches.\n", yards, feet, remaining_inches); // 计算总英寸数后再转厘米,用%.2f输出浮点数 printf("or %.2f centimeters\n", (yards*36 + feet*12 + remaining_inches)*2.54); }
内容的提问来源于stack exchange,提问作者Asatri
相关产品推荐
相关产品推荐

