>  기사  >  시스템 튜토리얼  >  Linux 커널에서 goto가 널리 사용되는데 왜 많은 책에서 goto 사용을 옹호하지 않습니까?

Linux 커널에서 goto가 널리 사용되는데 왜 많은 책에서 goto 사용을 옹호하지 않습니까?

PHPz
PHPz앞으로
2024-02-05 13:25:271222검색

C언어의 goto 문에 대해서는 많은 논란이 있으며, 많은 책에서는 "주의해서 사용하거나 사용하지 않는 것이 좋습니다"라고 권장하고 있습니다. 그러나 리눅스의 아버지인 리누스(Linus)는 리눅스에서 goto 문을 널리 사용했고, 이는 우리가 이 기능을 합리적으로 사용하도록 영감을 주었습니다.

논쟁 때문에 goto 문 사용법을 배우는 것이 필요합니다. goto 문의 몇 가지 기본 구문과 예를 살펴보겠습니다.

1. goto

의 기본 구문

goto 문은 키워드 goto와 태그 이름의 두 부분으로 구성됩니다. 레이블의 명명 규칙은 변수의 명명 규칙과 동일합니다. 예:

으아악

이 문이 제대로 작동하려면 함수에 label이라는 또 다른 문도 포함되어야 합니다. 이 문은 레이블 이름으로 시작하고 뒤에 콜론이 옵니다. 예:

label:printf(“goto here.n”);

2. goto

의 예

모든 코드를 보려면 왼쪽과 오른쪽으로 스와이프하세요>>>>

으아악

실행 결과:

Linux 커널에서 goto가 널리 사용되는데 왜 많은 책에서 goto 사용을 옹호하지 않습니까?

실행 결과에서 우리는 프로그램 실행 중에 goto 문을 만나면 레이블로 점프하여 실행을 계속할 수 있는 goto의 사용법을 분명히 알 수 있습니다.

한 가지 주목할 만한 점은 goto 문과 해당 점프 레이블이 동일한 함수 내에 있어야 한다는 것입니다.

3. goto, break, continue의 차이점은 무엇인가요?

jump문이기도 합니다. goto문과 break문, continue문의 차이점은 무엇인가요?

사실 break와 continue는 goto의 특별한 형태입니다. 중단 및 계속 사용의 장점은 이름이 이미 사용법을 나타낸다는 것입니다.

코드 예제를 통해 break 및 continue 사용법을 살펴보겠습니다.

1. 브레이크 테스트 기능

위의 테스트 프로그램을 사용하여 다음과 같은 break 문을 테스트하는 함수 void TestBreak(void);를 만듭니다.

모든 코드를 보려면 왼쪽이나 오른쪽으로 스와이프하세요>>>>

으아악

실행 결과:

Linux 커널에서 goto가 널리 사용되는데 왜 많은 책에서 goto 사용을 옹호하지 않습니까?

실행 결과에서 우리는 break가 현재 루프를 종료할 수 있다는 것을 분명히 알 수 있습니다.

이 예에서 첫 번째 break 문은 현재 for 루프를 종료하고 두 번째 break 문은 현재 while 루프를 종료합니다. 중단이 루프를 종료할 수 있음을 알 수 있습니다.

따라서 break와 goto의 특성에 따라 여러 단계의 루프에서 벗어나고 싶다면 goto를 사용하는 것이 더 편리할 것입니다.

2. 계속 테스트 기능

마찬가지로, continue 문을 테스트하기 위해 다음과 같은 함수 void TestContinue(void);를 구축하세요:

모든 코드를 보려면 왼쪽이나 오른쪽으로 스와이프하세요>>>>

으아악

실행 결과:

Linux 커널에서 goto가 널리 사용되는데 왜 많은 책에서 goto 사용을 옹호하지 않습니까?

continue가 이 루프를 종료하고(전체 루프가 아님) 다음 루프로 들어갈 수 있다는 실행 결과를 통해 분명히 알 수 있습니다(i는 루프 수를 나타냄).

四、支持与反对goto的理由是什么?

1、不提倡使用goto

不提倡使用goto的占比应该比较多,不提倡的原因主要是:很容易把逻辑弄乱且难以理解。

2、使用goto的理由

这一部分人认为goto可以用在以下两种情况比较方便:

(1)跳出多层循环。

这个例子就类似于我们上面的goto测试程序。

(2)异常处理。

一个函数的执行过程可能会产生很多种情况异常情况。下面有几种处理方式,以代码为例:

方法一:做出判断后,如果条件出错,直接return。

*左右滑动查看全部代码>>>*

int mystrlen(char *str)
{
   int count = 0;
   if (str == NULL)
   {
      return-1;
   }

   if (*str == 0)
   {
      return0;
   }

   while(*str != 0 )
   {
      count++;
      str++;
   }
   return count;
}

方法二:先设置一个变量,对变量赋值,只有一个return。

*左右滑动查看全部代码>>>*

int mystrlen(char *str)
{
   int ret;
   if (str == NULL)
   {
      ret = -1;
   }
   elseif (*str == 0)
   {
      ret = 0;
   }
   else
   {
      ret = 0;
      while(*str != 0 )
      {
         ret++;
         str++;
      }
   }
   return ret;
}

方法三:使用goto语句。

*左右滑动查看全部代码>>>*

int mystrlen(char *str)
{
   int ret;
   if (str == NULL)
   {
      ret = -1;
      goto _RET;
   }

   if (*str == 0)
   {
      ret = 0;
      goto _RET;
   }
       
   while(*str !=0 )
   {
      ret++;
      str++;
   }

_RET:
   return ret;
}

其中,方法三就是很多人都提倡的方式。统一用goto err跳转是最方便且效率最高的,从反汇编语句条数可以看出指令用的最少,消耗的寄存器也最少,效率无疑是最高的。

并且,使用goto可以使程序变得更加可扩展。当程序需要在错误处理时释放资源时,统一到goto处理最方便。这也是为什么很多大型项目,开源项目,包括Linux,都会大量的出现goto来处理错误!

위 내용은 Linux 커널에서 goto가 널리 사용되는데 왜 많은 책에서 goto 사용을 옹호하지 않습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제