C언어의 goto 문에 대해서는 많은 논란이 있으며, 많은 책에서는 "주의해서 사용하거나 사용하지 않는 것이 좋습니다"라고 권장하고 있습니다. 그러나 리눅스의 아버지인 리누스(Linus)는 리눅스에서 goto 문을 널리 사용했고, 이는 우리가 이 기능을 합리적으로 사용하도록 영감을 주었습니다.
논쟁 때문에 goto 문 사용법을 배우는 것이 필요합니다. goto 문의 몇 가지 기본 구문과 예를 살펴보겠습니다.
1. goto
의 기본 구문goto 문은 키워드 goto와 태그 이름의 두 부분으로 구성됩니다. 레이블의 명명 규칙은 변수의 명명 규칙과 동일합니다. 예:
으아악이 문이 제대로 작동하려면 함수에 label이라는 또 다른 문도 포함되어야 합니다. 이 문은 레이블 이름으로 시작하고 뒤에 콜론이 옵니다. 예:
label:printf(“goto here.n”);
모든 코드를 보려면 왼쪽과 오른쪽으로 스와이프하세요>>>>
으아악실행 결과:
실행 결과에서 우리는 프로그램 실행 중에 goto 문을 만나면 레이블로 점프하여 실행을 계속할 수 있는 goto의 사용법을 분명히 알 수 있습니다.
한 가지 주목할 만한 점은 goto 문과 해당 점프 레이블이 동일한 함수 내에 있어야 한다는 것입니다.
jump문이기도 합니다. goto문과 break문, continue문의 차이점은 무엇인가요?
사실 break와 continue는 goto의 특별한 형태입니다. 중단 및 계속 사용의 장점은 이름이 이미 사용법을 나타낸다는 것입니다.
코드 예제를 통해 break 및 continue 사용법을 살펴보겠습니다.
위의 테스트 프로그램을 사용하여 다음과 같은 break 문을 테스트하는 함수 void TestBreak(void);
를 만듭니다.
모든 코드를 보려면 왼쪽이나 오른쪽으로 스와이프하세요>>>>
으아악실행 결과:
실행 결과에서 우리는 break가 현재 루프를 종료할 수 있다는 것을 분명히 알 수 있습니다.
이 예에서 첫 번째 break 문은 현재 for 루프를 종료하고 두 번째 break 문은 현재 while 루프를 종료합니다. 중단이 루프를 종료할 수 있음을 알 수 있습니다.
따라서 break와 goto의 특성에 따라 여러 단계의 루프에서 벗어나고 싶다면 goto를 사용하는 것이 더 편리할 것입니다.
마찬가지로, continue 문을 테스트하기 위해 다음과 같은 함수 void TestContinue(void);
를 구축하세요:
모든 코드를 보려면 왼쪽이나 오른쪽으로 스와이프하세요>>>>
으아악실행 결과:
continue가 이 루프를 종료하고(전체 루프가 아님) 다음 루프로 들어갈 수 있다는 실행 결과를 통해 분명히 알 수 있습니다(i는 루프 수를 나타냄).
不提倡使用goto的占比应该比较多,不提倡的原因主要是:很容易把逻辑弄乱且难以理解。
这一部分人认为goto可以用在以下两种情况比较方便:
这个例子就类似于我们上面的goto测试程序。
一个函数的执行过程可能会产生很多种情况异常情况。下面有几种处理方式,以代码为例:
方法一:做出判断后,如果条件出错,直接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 중국어 웹사이트의 기타 관련 기사를 참조하세요!