为什么C语言printf()输出变量内存地址而非变量实际计算值
问题根因
输出随机异常值的核心原因是**printf输出结果时参数类型错误**:
%lld格式说明符要求传入long long类型的数值,但你在四个计算分支的输出语句中都写了&result,传入的是result变量在内存中的栈地址(属于指针类型)。- C语言标准库的
printf不会在运行时校验格式符和传入参数的类型匹配,直接把内存地址按长整型规则解析输出,得到的自然是和计算结果无关的随机大数,和你复现的异常表现完全吻合。
补充:这个错误是C语言新手的高频失误——
scanf读取输入时需要传入变量地址来修改内存中的值,因此要加&,但printf只需要读取变量的值输出,不需要传地址,不要混淆两个函数的传参规则。
修复方法
删除所有计算分支中printf参数里的取地址符&,直接传入result变量即可。修正后的核心分支代码如下,额外补充了除法运算的除零判断,避免输入除数为0时触发运行时崩溃:
switch(operator) { case 'a': result = num1 + num2; printf("%lld", result); break; case 's': result = num1 - num2; printf("%lld", result); break; case 'm': result = num1 * num2; printf("%lld", result); break; case 'd': if (num2 == 0) { printf("Invalid operation: divide by zero"); break; } result = num1 / num2; printf("%lld", result); break; default: printf("Invalid operator"); }
内容的提问来源于stack exchange,提问作者user19117225
相关产品推荐
相关产品推荐

