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
相关产品推荐
相关产品推荐

