서문
goto 문은 무조건 전송 문이라고도 합니다. 기본 형식은 다음과 같습니다.
문 레이블은 유효한 식별자와 "; ", 여기서, 식별자의 명명 규칙은 변수 이름과 동일합니다. 즉, 문자, 숫자, 밑줄로 구성되며 첫 번째 문자는 문자 또는 밑줄이어야 합니다. goto 문을 실행한 후 프로그램은 명령문 레이블로 점프하고 후속 명령문을 실행합니다.
일반적으로 goto 문은 if 조건문과 함께 사용됩니다. 그러나 goto 문은 프로그램에 유연성을 제공하지만 프로그램 구조를 불분명하고 읽기 어렵게 만들기 때문에 사용해야 합니다. 합리적으로.
발견된 문제
goto 이후에 변수를 정의하는 문제가 자주 발생하는데 Linux에서 컴파일이 통과되지 않습니다(오류 메시지: 교차 초기화 의). 사실 참고만 하시면 될 것 같아요 오늘은 회사 선배님들께 여쭤본 후 기억을 깊게 하려고 정보를 좀 찾아보고 녹음해 보았는데 조금이나마 도움이 되셨으면 좋겠습니다.
오류 샘플 코드:
#include <iostream> using namespace std; int main() { goto Exit; int a = 0; Exit: return 0; }
오류 보고서:
[root@localhost c-c++]# g++ goto_study.cpp goto_study.cpp: In function 'int main()': goto_study.cpp:31: error: jump to label 'Exit' goto_study.cpp:29: error: from here goto_study.cpp:30: error: crosses initialization of 'int a'
정확
쓰기는 올바른 쓰기 방식이라고 할 수 없으며 단지 OK를 컴파일하는 쓰기 방식이라고 말할 수 있습니다.
코드 직접 입력:
작성 방법 1:
도메인 변경 및 로컬 변수 만들기:
int main() { goto Exit; { int a = 0; } Exit: return 0; }
쓰기 방법 2
마법의 쓰기 방법:
int main() { goto Exit; int a; a = 1; Exit: cout << "a = " << a << endl; return 0; }
핵심은 여전히 액세스할 수 있다는 것입니다. ! 결과:
[root@localhost c-c++]# g++ goto_study.cpp [root@localhost c-c++]# ./a.out a = 1259648
의 마법같은 글쓰기 방법 연구 가장 의아스러운 점은 두 번째 방법을 컴파일하여 사용할 수 있는데, 여전히 사용할 수 있다는 것입니다. ? ?
C++ 규정
참조 [1][2]에서는 C++ 표준의 규정을 언급했습니다. > 초기화를 통해 선언을 우회하는 방식으로 점프하는 프로그램입니다. 자동 저장 기간을 갖는 지역 변수가 없는 시점부터 변수에 POD가 없으면 범위 내에 있는 지점까지의 범위는 형식이 잘못되었습니다. 유형(3.9)이며 초기화 없이 선언됩니다.
은 프로그램의 실행 경로가 코드의 A 지점(지역 변수 x가 정의되지 않음)에서 코드의 다른 지점 B로 점프하는 경우를 의미합니다. (지역 변수 x는 정의되고 정의될 때 초기화되었습니다.) 그러면 컴파일러는 오류를 보고합니다. 이러한 점프는 goto 문이나 switch-case를 실행하여 발생할 수 있습니다. 따라서 두 번째 작성 방법에서는 a 가 int 유형, POD 유형이고 초기화되지 않았으므로 컴파일이 통과됩니다. 그러나 분명한 사실은 이 변수 a를 사용하면 결과를 알 수 없다는 점입니다. 전임자가 말했듯이 의미가 없으므로 지원하지 않는 것이 좋습니다! 로컬에서만 사용되는 경우 중괄호로 묶을 수 있습니다! 인터넷의 일부 사람들은 C++ 사양이 이것이 잘못되었음을 명시적으로 언급하지는 않지만 변수 도메인의 조항은 실제로 이 접근 방식이 바람직하지 않다고 암묵적으로 말하고 있다고 말했습니다. 참조 [4]를 참조하세요.
암시적 설명
Goto는 변수 정의를 건너뛸 수 없습니다.
변수의 수명은 점프 시점에서 시작되므로 점프 후에는 존재하지 않습니다.
정의에는 goto must not이 명시적으로 언급되어 있지 않은 것 같습니다.
하지만 이는 변수 수명에 대해 언급된 내용에 암시되어 있습니다. 예, 컴파일러의 이 플래그를 설정하여 경고로 전환할 수 있지만 이는 실행되지 않습니다! ! !
POD 유형
#include <iostream> using namespace std; class A{ public: // 注意:和B不同的是有构造和析构函数, 所以编译报错 A(){} ~A(){} void testA(){ cout << "A::test." << endl; } }; class B{ public: void testB(){ cout << "B::test." << endl; } }; int main() { goto Exit; // int a = 1; // windows ok.linux failed! //A classA; // failed: B classB; // success: classB.testB(); Exit: classB.testB(); return 0; }
1. 위 코드는 Windows와 Linux 모두에서 컴파일되고 실행됩니다.
[root@localhost c-c++]# g++ goto_study.cpp [root@localhost c-c++]# ./a.out a = 1259648 B::test.
3. int a = 1; windows(msvc)를 설명해주세요. ! !
다음은 POD 유형입니다(영어로 읽겠습니다).
3. 열거형입니다.
4. POD의 const와 일반 변수도 동일합니다.
5. POD 유형 클래스, 구조체 및 공용체에도 동일하게 적용됩니다. 그러나 모든 멤버는 공개되어야 하며 기본 클래스, 생성자, 소멸자 및 가상 함수가 없습니다. 정적 멤버에도 이러한 규칙이 적용됩니다.
요약
1. goto를 사용하지 않는 것이 가장 좋습니다.
2. goto 이후 변수 정의 및 초기화를 건너뛰지 마세요. POD 유형인 경우 먼저 선언한 후 정의하면 컴파일 오류가 보고되지 않습니다. 다만, 이런 식으로 사용하는 것은 권장하지 않습니다. 실행문이 할당문을 건너뛰면 변수의 값을 알 수 없어 위험합니다.
3. 뒤에 지역변수가 있는 경우; goto에서는 중괄호를 사용하여 로컬 도메인을 구성하는 것이 안전합니다.
이상은 이 글의 전체 내용입니다. 모든 분들의 공부나 업무에 조금이나마 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시면 메시지를 남겨주세요.
더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!