首页 > 解决方案 > 将 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 也评估为真?

标签: cif-statement

解决方案


的定义并scanf()没有说明它将对无法分配的参数的值做什么,但在实践中总是保持不变。

在这种情况下,nandi都被统一化并且可能包含任何值 - 在你的情况下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 ;
}

推荐阅读