C语言"goto"的一些问题

Some questions about "goto" in C language

我有一些关于 goto 的问题。这是我的代码:

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

问题是,无论值 a 是什么(例如:a=-1a=0), 可以打印 out.
谁能告诉我原因,万分感谢

假设 a 的值为 1,在这种情况下,a<0 为假,因此跳过 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,因此使用它被认为是一种不好的做法。

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

您可能需要一个 if else 或至少一个带括号的 if

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

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

无论是否输入'if'语句,下一条语句都是printf语句。

如果它跳过 'if statement',接下来会出现 printf,如果输入 'if statement',那么它会转到 printf。无论哪种方式,该语句都会显示。

'out' 有点像程序集跟踪的索引。如果 goto 'out' 不存在,printf 仍会存在,只是没有编译器跟踪的内存位置。

如果 a < 0. 您点击了 goto,它会将您带到带标签的代码。如果 a >= 0,则跳过 goto... 但无论如何,下一行是带标签的代码。当 goto 将执行路径带到那里时,标记的代码不会 - 仅 - 得到执行。

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<0) 为真,则 PC 将移动到您指向的位置,而不是向下移动,否则会向下移动。

您的代码总是转到 printf 的原因很简单:如果 (a<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(它会导致意大利面条代码)

goto可以执行两种类型的跳跃。 1 --> 向前跳跃 2 --> 向后跳跃

您可以尝试以下程序:

   #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 语句,因为这是一种非常糟糕的编程习惯。另请阅读 link Problems that can arise from using a GOTO statement to jump down only?,其中对 goto 语句的使用有一些争论。