> 백엔드 개발 > C#.Net 튜토리얼 > C++ 점프 문 Goto가 변수 정의에 미치는 영향에 대한 자세한 설명

C++ 점프 문 Goto가 변수 정의에 미치는 영향에 대한 자세한 설명

黄舟
풀어 주다: 2016-12-14 17:15:30
원래의
1769명이 탐색했습니다.

서문

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 &#39;int main()&#39;:
goto_study.cpp:31: error: jump to label &#39;Exit&#39;
goto_study.cpp:29: error: from here
goto_study.cpp:30: error: crosses initialization of &#39;int a&#39;
로그인 후 복사

정확

쓰기는 올바른 쓰기 방식이라고 할 수 없으며 단지 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이 명시적으로 언급되어 있지 않은 것 같습니다. 하지만 이는 변수 수명에 대해 언급된 내용에 암시되어 있습니다. 예, 컴파일러의 이 플래그를 설정하여 경고로 전환할 수 있지만 이는 실행되지 않습니다! ! !

정보를 확인한 후 fpermissive 마크의 기능은 코드의 구문 오류를 경고로 사용하여 컴파일 프로세스를 계속하는 것이므로 안전을 위해 여기에서는 생각하지 마십시오. 각도, 그냥 솔직하게 코딩하세요!


POD 유형

참조 [3]은 위의 C++ 규정에 따라 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.
로그인 후 복사

2. A classA 문장은 Windows와 Linux 모두에서 컴파일에 실패합니다! A에는 생성자와 소멸자가 있으므로 조건을 충족하지 않습니다.

3. int a = 1; windows(msvc)를 설명해주세요. ! !

다음은 POD 유형입니다(영어로 읽겠습니다).

1. int, char, wchar_t, bool, float, double은 POD 유형이며 이러한 유형은 long/short입니다. 그리고 서명된/서명되지 않은 버전의 경우에도 마찬가지입니다.


2. 포인터(함수 포인터 및 멤버 포인터 포함)는 모두 POD 유형입니다.

3. 열거형입니다.

4. POD의 const와 일반 변수도 동일합니다.

5. POD 유형 클래스, 구조체 및 공용체에도 동일하게 적용됩니다. 그러나 모든 멤버는 공개되어야 하며 기본 클래스, 생성자, 소멸자 및 가상 함수가 없습니다. 정적 멤버에도 이러한 규칙이 적용됩니다.

요약

1. goto를 사용하지 않는 것이 가장 좋습니다.

2. goto 이후 변수 정의 및 초기화를 건너뛰지 마세요. POD 유형인 경우 먼저 선언한 후 정의하면 컴파일 오류가 보고되지 않습니다. 다만, 이런 식으로 사용하는 것은 권장하지 않습니다. 실행문이 할당문을 건너뛰면 변수의 값을 알 수 없어 위험합니다.

3. 뒤에 지역변수가 있는 경우; goto에서는 중괄호를 사용하여 로컬 도메인을 구성하는 것이 안전합니다.

이상은 이 글의 전체 내용입니다. 모든 분들의 공부나 업무에 조금이나마 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시면 메시지를 남겨주세요.

더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿