【问题标题】:How do i write C code without using a goto keyword?如何在不使用 goto 关键字的情况下编写 C 代码?
【发布时间】:2019-12-22 11:17:24
【问题描述】:

我使用 goto 关键字编写了这段代码:

#include<stdio.h>
    
    int main()
    {
        int i,j,k;
         for(i=1;i<=3;i++)
         {
         for(j=1;j<=3;j++)
         {
         for(k=1;k<=3;k++)
         {
         [***if(i==2&&j==2&&k==2)
         
           goto out;][1]
         else
         printf("%d %d %d\n ",i,j,k);***
        }
        }
       }
       out:
       printf("\nOut of the loop");
        return 0;
    }

我尝试在 if 语句和 switch case 的帮助下不使用 goto 来编写它。但我不能以完美的逻辑来。请有人帮我解决这个问题。

#include<stdio.h>
    
int main()
{
        int i,j,k;
         for(i=1;i<=3;i++)
         {
         for(j=1;j<=3;j++)
         {
         for(k=1;k<=3;k++)
         {
         if(i>=2&&j>=2&&k>=2)
         break;
         else
         printf("%d %d %d\n ",i,j,k);
    
        }
        **

**switch(i>=2&&j>=3&&k>=1)
        {
        case 1: break;
        default : break;
     }**

**
     }
        switch(i>=3&&j>=2&&k>=2)
        {
        case 1: break;
        default : break;
     }
     }
     return 0;
    }

【问题讨论】:

  • 不要在代码 sn-ps 中添加格式。在您想指出的行上添加 cmets,如果您需要更多说明,请在问题中对这些行进行解释。
  • 至于打破多层嵌套循环,首先尽量避免嵌套循环,这样就不会出现这个问题了。例如,您可以改用包含循环的函数,并检查函数的返回值。否则在外部循环中使用额外的状态变量和if 检查。
  • 防止 goto 的第一条规则是重构代码。然后,在 C 语言中有两种情况允许使用 goto:跳出内部循环和错误处理。这两种情况都可能需要大量状态变量和其他人为(不可读、消耗处理器周期)构造来防止 goto。
  • 您介意我修复缩进吗?我的眼睛受伤了!

标签: c for-loop if-statement logic goto


【解决方案1】:

您可以使用另一个变量并使用它来“通知”循环它们应该结束。

#include<stdio.h>

int main()
{
    int i,j,k;
    int run_me = 1;
    for (i = 1; run_me && i <= 3; i++) {
      for (j = 1; run_me && j <= 3; j++) {
        for (k = 1; run_me && k <= 3; k++) {
          if (i == 2 && j == 2 && k == 2) {
             run_me = 0;
          } else {
             printf("%d %d %d\n ",i,j,k);***
          }
        }
      }
   }
   printf("\nOut of the loop");
   return 0;
}

您可以从循环中创建一个函数。

#include<stdio.h>

void function(void) 
{
    int i,j,k;
    for (i = 1; i <= 3; i++) {
      for (j = 1; j <= 3; j++) {
        for (k = 1; k <= 3; k++) {
          if (i == 2 && j == 2 && k == 2) {
             return;
          } else {
             printf("%d %d %d\n ",i,j,k);***
          }
        }
      }
   }
}

int main()
{
   function();
   printf("\nOut of the loop");
   return 0;
}

【讨论】:

    【解决方案2】:

    你可以改变循环内的控制变量

    for (i = 0; i < 2; i++) {
        for (j = 0; j < 4; j++) {
            for (k = 0; k < 8; k++) {
                if ((i == 2) && (j == 2) && (k == 2)) {
                    // change control variables to finish their loop
                    k = j = i = 9; break; // exit all loops
                }
                printf("%d, %d, %d\n", i, j, k);
            }
        }
    }
    

    【讨论】:

    • 这可以被认为是 hack 并且不是一般用途,循环可能不是for 循环而是while 循环。然后你必须写一个让所有这些都失败的语句,而这通常是不可能的。
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2014-06-03
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多