为什么这里会出现“悬空”的情况?

时间:2016-11-27 02:38:30

标签: c

你认为这是悬空else吗?

根据编译器和IIT教授的说法。但我有疑问!根据理论,在满足if的条件后,它将始终仅处理一个语句(或一个复合语句,即括号内的多个语句)。这里,在处理并满足第一个if之后,编译器应该考虑另一个if的立即语句并检查条件。如果不满足条件,则编译器将不显示任何结果,因为我们没有任何关联的else printf函数表示条件不满足(即n不为零)。

这里,编译器应始终将程序中给定的else与第一个if子句相关联,因为在if之后给出的所有语句都没有用括号括起来。那么,为什么会出现悬挂else的情况呢?

#include <stdio.h>

void main(void)
{
  int n = 0;
  printf("Enter value of N: ");
  scanf("%d",&n);
  if (n > 0)
  if (n == 0)
    printf("n is zero\n");
  else
    printf("n is negative\n");
  getch();
}

3 个答案:

答案 0 :(得分:1)

Wikipedia's definition of dangling else,你有一个悬空的其他声明。

C使您的代码明确无误。您的代码被解释为:

if (n > 0)
{
   if (n == 0)
   {
      printf("n is zero\n");
   }
   else
   {
      printf("n is negative\n");
   }
}

您是否将代码解释为:

if (n > 0)
{
   if (n == 0)
   {
      printf("n is zero\n");
   }
}
else
{
   printf("n is negative\n");
}
你会感到惊讶。

FWIW,无论使用哪种解释,您的代码都是错误的。

您需要拥有的是:

if (n > 0)
{
   printf("n is positive\n");
}
else
{
   if (n == 0)
   {
      printf("n is zero\n");
   }
   else
   {
      printf("n is negative\n");
   }
}

if (n > 0)
{
   printf("n is positive\n");
}
else if (n == 0)
{
   printf("n is zero\n");
}
else
{
   printf("n is negative\n");
}

答案 1 :(得分:0)

  1. if (n == 0) printf("n is zero\n"); else printf("n is negative\n");是一个声明和
  2. 我强烈建议你不要特别注意学习悬空的概念(除非它会出现在测试中),而是学习总是使用大括号的概念,因为它有助于阅读代码,它有助于防止错误,特别是在插入调试语句时。
  3. 所以写:

    if (n > 0) {
        if (n == 0) {
            printf("n is zero\n");
        } else {
            printf("n is negative\n");
        }
    }
    

    if (n > 0) {
        if (n == 0) {
            printf("n is zero\n");
        }
    } else {
        printf("n is negative\n");
    }
    

    每个人都清楚一切。

    BTW:正确的缩进 - 由于我承认的复制和粘贴可能会被破坏 - 也有助于阅读代码和防止错误。

答案 2 :(得分:0)

+1 @Bodo Thiesen建议总是使用花括号。我建议您也使用 clang-format 自动格式化代码。它将正确地识别一切,并且通常使编码变得美妙。

您可以广泛配置clang格式以匹配您的首选样式 - 这是您在LLVM的家居风格中的代码格式。

#include <stdio.h>

void main(void) {
  int n = 0;
  printf("Enter value of N: ");
  scanf("%d", &n);
  if (n > 0)
    if (n == 0)
      printf("n is zero\n");
    else
      printf("n is negative\n");
  getch();
}