【问题标题】:Evaluation of the if condition in c as true or false将 c 中的 if 条件评估为真或假
【发布时间】:2021-01-09 11:27:37
【问题描述】:
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 中的值无效,除非scanf 返回成功,在这种情况下返回值为1
  • 你必须像int n = 0;一样初始化n。否则它的值是随机的(非零)。
  • 这是未定义的行为int n 尚未初始化,scanf() 尚未设置任何值。今天的true 是明天的false
  • “即使 n==0 中有 0” - 谁说的?你当然没有。由于它们的声明方式(没有初始化),ni 在明确分配值之前都是indeterminate(例如从scanf 成功填充,您应该验证)。

标签: c if-statement


【解决方案1】:

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

在这种情况下,ni 都被统一化并且可能包含任何值 - 在你的情况下,n 在你尝试它的那一刻碰巧包含零,但这不是给定的 - 它是 未定义。 C 运行时不需要将具有auto 存储类(本地,非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 ;
}

【讨论】:

    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多