在C中使用goto关键字

时间:2013-07-13 19:15:56

标签: c goto

# include <stdio.h>

int main()
{
  int a=5;
  begin:
  if(a)
       printf("%d\n",a);
   a--;
   goto begin;
   return 0;
 }

当a变为0时,如果条件不会执行,那么为什么输出在这段代码中将是无限的意味着

输出 -

 5
 4
 3
 2
 1
 0
-1
-2
and so on endless

3 个答案:

答案 0 :(得分:3)

如果程序确实为您打印0,那么您的编译器(甚至是您的机器......)可能会出现严重问题。我怀疑它不打印0,但你的问题是程序无限循环的原因。

这是因为if - 主体仅包含print语句。因此,当a达到0时,它不会被打印,而是行

a--;
goto begin;

仍在执行中。机器将遵守,返回begin并继续循环。最快的解决方法是在a != 0之后在所有语句周围添加括号:

if(a){
    printf("%d\n",a);
    a--;
    goto begin;
}

return 0;

这将使程序仅循环,直到a为0,然后返回。

但真正的问题是:不要使用goto(为此)!这是使用while loop

的完美情况
while(a--){
    printf("%d\n", a);
}

return 0;

while - 身体周围的大括号在这里甚至不是必需的,但只是好习惯)

答案 1 :(得分:1)

这是因为在if再次执行goto语句之后,a的值已经变为0以外的其他值。现在,您再次获得goto语句,因此if继续执行并打印负值。

这样看: -

声明

  

printf("%d\n",a);

仅当if中的条件为真时才执行

。这里的TRUE指的是不等于0的任何内容,因此,当printfa时,0不执行,而对任何其他值执行a--。现在,gotoifif之外执行,因此它们会一次又一次地执行,使goto中的条件始终为true,并且无限地打印负值。

然而,

我的问题是,你为什么要使用{{1}}?

答案 2 :(得分:0)

if a==1 -> Evaluates to TRUE
if a==0 -> Evaluates to FALSE
if a==-1 -> Evaluates to TRUE

因此它将按降序显示数字,但0不会显示。