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

scanf()返回值两种赋值方式的差异及选用原因

scanf返回值赋值的两种写法差异分析

首先明确scanf("%ld", &num)的返回值规则:

  • 返回成功匹配并完成赋值的参数个数,对于单个%ld格式符:
    • 成功读取整数时返回 1
    • 输入内容与格式不匹配(如输入q)时返回 0
    • 遇到输入流结束(如Ctrl+D/Unix或Ctrl+Z/Windows)时返回 EOF(通常为-1)

两种写法的核心区别

1. input_is_good = (scanf("%ld",&num) == 1);

这种写法是显式判断是否完成有效赋值:

  • 只有当scanf确实成功读入1个整数时,==1的结果为true,input_is_good被设为true
  • 所有失败场景(返回0或EOF)都会让条件不成立,input_is_good为false
  • 代码意图清晰:只认可"成功读入整数"的情况为有效输入

2. input_is_good = scanf("%ld",&num);

这种写法是直接将scanf的返回值(int类型)赋值给bool变量:

  • C语言中bool类型会把所有非0值视为true,0视为false
  • 输入成功时返回1,赋值后input_is_good为true,这时候和第一种写法效果一致
  • 但遇到输入流结束(返回EOF即-1)时,非0值会被转为true,导致循环无限执行——因为scanf已经无法读取新内容,num会保留上次的值,程序会反复累加同一个数,陷入死循环

成功场景下的差异

在输入完全匹配(scanf返回1)的场景下,两种写法的运行结果没有区别:input_is_good都会被设为true,正常进入循环累加。

但第一种写法的可读性远高于第二种——它直接告诉维护者:我们只关心是否成功读入了一个整数,而不是依赖bool对非0值的隐式转换,避免了潜在的逻辑歧义。


内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:50:09