c - 将 c 中的 if 条件评估为真或假
问题描述
int n,i;
scanf("%d",&n);
if(n==0)
printf("a");
else if (!(n>=1))
printf("b");
当我将输入作为 m 时,条件 (n==0) 的评估结果为真。当条件是有效表达式且非零时,则为真。当我用 i 替换 n 并提供相同的输入时,条件 n==0 被评估为假。为什么会这样?。为什么即使 n==0 中有 0 也评估为真?
解决方案
的定义并scanf()
没有说明它将对无法分配的参数的值做什么,但在实践中总是保持不变。
在这种情况下,n
andi
都被统一化并且可能包含任何值 - 在你的情况下n
,在你尝试它的那一刻碰巧包含零,但这不是给定的 - 它是undefined。C 运行时不需要将auto
存储类 (local, non- static
) 的变量初始化为零。
int n = 0;
int i = 0;
另请注意,它sscanf()
返回导致成功分配的格式说明符的数量,因此您可以例如:
while( scanf("%d",&n) == 0 )
{
// wait until valid input
}
这比仅依赖“默认”值的初始化更安全,因为scanf()
严格不保证它在任何情况下都不会修改参数 - 这只是一个不寻常的实现。同样在实践中,您通常希望以一种或另一种方式处理错误输入,而不是简单地忽略它并使用默认值。如果需要,提供默认值的一种安全且明确的方式是:
if( scanf("%d",&n) == 0 )
{
n = 0 ;
}
推荐阅读
- java - ServerSocketChannel.open() 从未返回
- asp.net-core - HttpContext 总是返回 null
- sql - PL/SQL 包永远运行
- django - 需要帮助在 django 模型中定义外键
- c# - VS 2017,直接 CSharpCodeProvider 使用 C#7
- c# - 表格布局面板的winform自动滚动不起作用
- compiler-errors - HAWQ安装错误
- javascript - 关于点的大工具提示 - Highcharts
- r - 如何在 R 中修复“无法加载 cairo DLL”?
- angular - 没有 Rx.interval 的 Angular 无限 HTTP 轮询循环