【问题标题】:Some questions about "goto" in C language [closed]关于 C 语言中“goto”的一些问题 [关闭]
【发布时间】:2016-05-30 03:42:04
【问题描述】:

我对@9​​87654321@有一些疑问。这是我的代码:

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

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

【问题讨论】:

  • 因为代码中没有任何内容会导致printf 行被跳过。 goto 什么都不做,因为它只会导致下一行被执行——无论goto 是否运行,都会发生这种情况。
  • 我不明白这个问题的动机,除非 OP 对条件执行或签名比较感到困惑。无论您将a 设置为什么值,您最终都会得到out: 标签。如果out: 出现 printf("out") 之后,您可能会根据(a) 的值获得不同的程序行为...
  • 有两种情况,对吧? (1) 如果a&lt;0 则执行goto 并将控制转移到out 标签,并打印out。 (2) 如果a &gt;= 0 则跳过goto,并将控制传递到if 语句之后的第一条语句。但这只是带有out 标签的语句,并且将再次打印out。没有通过函数的路径可以避免它。这有多令人困惑?
  • 如果我是一个可疑的人,我会说这个问题是投票环或傀儡食物。
  • 这不是使用goto 的场景,因为printf() 正在执行某某,有或没有你的goto。 (-:

标签: c printf goto


【解决方案1】:

假设a的值为1,此时a&lt;0为假,则跳过goto out;的if语句,程序继续顺序执行。下一条语句显然是:

out:
    printf("out");

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

如果a 的值是-1,在这种情况下a&lt;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 的值为-1a&lt;0 为真,所以goto in; 将被执行。这将控制执行到以下语句:

in:
        printf("in");

因此,上述代码sn-p的输出为in

以上代码的现场演示是here

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果 a = 0,则跳过 goto... 但无论如何,下一行是标记代码。带标签的代码不会仅在 goto 将执行路径带到那里时执行。

      【讨论】:

        【解决方案4】:

        首先,尽可能避免使用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;
        }
        

        【讨论】:

        • 感谢@BatCoder。我将问题解读为:为什么我的 goto 声明没有按预期工作?虽然其他人的回答会让他正确使用goto,但我关注的是他的最终要求和最佳解决方案。
        【解决方案5】:

        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 声明,因为它非常糟糕编程实践。也请通过链接Problems that can arise from using a GOTO statement to jump down only?goto 语句的使用有一些争论。

        【讨论】:

          【解决方案6】:
          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

          您的代码总是转到 printf 的原因很简单:如果 (a

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

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

          最后一点:使用 goto 被认为是不好的,因为...好吧,因为它这么说 here(它会导致意大利面条代码)

          【讨论】:

            猜你喜欢
            • 2012-05-14
            • 2012-11-27
            • 1970-01-01
            • 1970-01-01
            • 2011-06-16
            • 1970-01-01
            • 2011-03-03
            • 1970-01-01
            • 2018-06-22
            相关资源
            最近更新 更多