关于" goto"的一些问题用C语言

时间:2016-05-30 03:42:05

标签: c printf goto

我对goto有疑问。这是我的代码:

int main(){ 
    int a = 1;
    if (a<0)
        goto out;
    out:
    printf("out");
    return 1;
}

问题是, a 的值是什么(例如: a=-1 a=0 ),可以打印 out 谁能告诉我原因,非常感谢你。

6 个答案:

答案 0 :(得分:6)

假设a的值为1,在这种情况下,a<0为false,因此跳过if语句goto out;并且程序恢复顺序执行。下一个陈述显然是:

out:
    printf("out");

请注意out:只是一个标签,因此执行printf()语句。因此,打印out,因为它是执行程序的下一个连续步骤(而不是因为if条件为真)。

如果a的值是-1,在这种情况下a<0为真,那么执行if语句goto out;并且控件转到:

out:
    printf("out");

因此,在这两种情况下,都会打印out

为了更好地理解,请考虑以下示例:

#include <cstdio>

int main(){ 
    int a = -1;

    if (a<0)
        goto in;

    out:
    printf("out");

    in:
    printf("in");

    return 0;
}

此处,由于a的值为-1,因此a<0为真,因此会执行goto in;。这将控制执行到以下语句:

in:
        printf("in");

因此,上述代码段的输出为in

上述代码的实时演示为here

P.S。:使用goto语句会破坏normal flow of the program,因此使用它被认为是一种不好的做法。

答案 1 :(得分:5)

无论是否&#39;如果&#39;是否输入了语句,下一个语句将是printf语句。

如果它跳过&#39; if语句&#39;,则接下来会出现printf,如果&#39; if语句&#39;输入,然后转到printf。无论哪种方式,都会显示该语句。

&#39; out&#39;有点像组件跟踪的索引。如果goto&#39; out&#39;不存在,printf仍然存在,只是没有编译器跟踪的内存位置。

答案 2 :(得分:4)

如果&lt; 0.你点击goto,它会带你到标记的代码。如果a> = 0,则跳过goto ...但是下一行是标记的代码,无论如何。当goto将执行路径带到那里时,标记的代码不会被执行。

答案 3 :(得分:2)

首先,你应该尽可能避免使用goto

您可能想要一个if else或至少一个括号if

 int main(){ 
    int a = 1;
    if (a<0){
        printf("out");
    }
}

OR

int main(){ 
    int a = 1;
    if (a<0){
        printf("out");
    }
    else {
         print("in");
    }
    return 1;
}

答案 4 :(得分:2)

goto可以执行两种类型的跳转。 1 - &gt;向前跳跃 2 - &gt;向后跳

您可以尝试以下程序:

   #include<conio.h>
   #include<stdio.h>
   #include<stdio.h>
   main()
   { 
     int i=1;
     goto x;
     y: 
     printf("This is the 1st goto statement\n");
     goto z;
     x:
     if(i==1)
     {
      printf("This is the 2nd goto statement\n");
      goto y;   
     }
     z:
     printf("End of the program\n");
   } 

注意:虽然我同意这在知识观点上已经足够好了,但我强烈建议您不要使用 goto语句,因为它是非常糟糕的编程习惯。另请注意Problems that can arise from using a GOTO statement to jump down only?链接,该链接对goto声明的使用存在争议。

答案 5 :(得分:1)

int main(){ 
    int a = 1;                    // 1
    if (a<0)                      // 2
        goto out;                 // 3
    out:                          // 4
    printf("out");                // 5
    return 1;
}

执行代码时,会从上到下执行。当插入诸如条件(if-else,switch case),循环(while,for)或其他特殊语句(如你的goto)之类的代码时,代码可以有间接流,这意味着它有时会偏离主路径。

现在,如果你看看没有第2-4行的代码,你会得到一个简单的printf代码。如果你添加这些行,你会得到一个新的代码执行选项 - 如果(a&lt; 0)为真,那么PC将移动到你指向它的地方,而不是向下移动,否则就会发生。

你的代码总是转到printf的原因很简单:if(a&lt; 0)如果是,则“goto”将PC发送到printf。否则,代码的标准流程将把PC发送到那里。

如其他答案中所述,如果您在(a> 0)为假时想要避免使用printf,则可以使用:

int main(){ 
int a = 1;
if (a<0)
  printf("out");
/* else
   printf("in"); */ 
return 1;
}

最后注意:使用goto被认为是错误的,因为......好吧,因为它说here(它会导致意大利面条代码)