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

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

Dec 14, 2016 pm 05:15 PM

서문

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)를 주목해주세요!


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python에서 변수를 정의하는 방법은 무엇입니까? Python에서 변수를 정의하는 방법은 무엇입니까? Jun 04, 2023 am 10:02 AM

Python에서 변수는 데이터를 저장하는 컨테이너로 이해될 수 있습니다. 데이터를 사용하거나 조작해야 할 경우 데이터를 쉽게 호출하고 처리할 수 있도록 데이터를 저장할 변수를 정의할 수 있습니다. 다음은 Python에서 변수를 정의하는 방법을 소개합니다. 1. 명명 규칙 Python에서 변수 명명 규칙은 매우 유연하며 일반적으로 다음 규칙을 따라야 합니다. 변수 이름은 문자, 밑줄 및 숫자로 구성되며 첫 번째 부분은 숫자가 될 수 없습니다. 변수 이름은 대문자와 소문자를 사용할 수 있지만 Python에서는 대소문자를 구분합니다. 변수 이름

C언어에서 goto문의 의미는 무엇인가요? C언어에서 goto문의 의미는 무엇인가요? Dec 22, 2022 pm 06:00 PM

C 언어에서 goto 문은 무조건 전송 문이라고 하며, 동일한 함수 내에서 레이블이 지정된 문으로 무조건 제어를 전송할 수 있습니다. 구문은 "goto label;...label: 문;"입니다. C를 제외한 모든 것 C 프로그램에서 goto 문 앞이나 뒤에 설정할 수 있는 키워드 이외의 일반 텍스트입니다.

Go 언어에서 goto를 사용하는 방법 Go 언어에서 goto를 사용하는 방법 Nov 23, 2022 pm 06:40 PM

Go 언어에서 goto 문은 프로그램의 지정된 줄로 무조건 점프하는 데 사용됩니다. 이는 레이블을 사용하여 코드 사이를 무조건 점프합니다. goto 뒤에는 레이블이 옵니다. 이 레이블의 의미는 Go 프로그램에 다음에 실행할 코드 행을 알려주는 것입니다. 구문은 "goto label;... ...label: 표현식;"입니다. goto는 원래 코드 실행 순서를 깨고 지정된 줄로 직접 점프하여 코드를 실행합니다. goto 문은 일반적으로 조건문과 함께 사용되며 조건부 전송을 구현하고 루프를 형성하며 루프 본문에서 점프하는 데 사용할 수 있습니다.

Golang 함수에서 변수를 정의할 때 할당 방법 및 차이점 Golang 함수에서 변수를 정의할 때 할당 방법 및 차이점 May 17, 2023 pm 07:01 PM

Golang은 컴파일 타임에 자동으로 유형을 확인하는 빠르고 효율적이며 현대적인 프로그래밍 언어이며 동시성 및 메모리 안전성과 같은 기능을 갖추고 있어 점점 더 많은 개발자가 선호하고 있습니다. Golang에서는 비즈니스 로직을 캡슐화하기 위해 함수를 사용해야 하는 경우가 많으며, 함수에서 변수를 정의할 때 할당 방법이 일반적인 문제입니다. 이 기사에서는 이 문제를 자세히 설명하고 차이점을 분석합니다. 변수 정의 Golang에서 변수는 var와 :=의 두 가지 방법으로 정의할 수 있습니다. 그 중 var square

PHP에서 변수와 상수를 정의하는 방법 PHP에서 변수와 상수를 정의하는 방법 May 11, 2023 pm 04:03 PM

PHP는 확장성과 실용성이 뛰어나 널리 사용되는 프로그래밍 언어입니다. PHP에서 변수와 상수는 값을 저장하고 표현하며 중요한 정보를 저장하는 데 사용할 수 있는 매우 중요한 개념입니다. 이 글에서는 초보자가 빠르게 시작할 수 있도록 PHP에서 변수와 상수를 정의하는 방법을 자세히 소개합니다. 1. 변수 정의 변수는 값을 저장하는 데 사용되는 이름 또는 식별자입니다. PHP에서 변수 정의는 변수 선언, 변수 할당, 변수 사용의 세 단계로 나눌 수 있습니다. 아래에서 자세히 설명하겠습니다.

프로그래밍 효율성 향상: Go 언어의 점프문 적용을 마스터하세요. 프로그래밍 효율성 향상: Go 언어의 점프문 적용을 마스터하세요. Mar 21, 2024 pm 05:03 PM

프로그래밍 효율성 향상: Go 언어 점프 문 적용을 마스터하세요. Go 언어 프로그래밍에서 점프 문은 일반적으로 사용되는 제어 문으로, 점프 및 코드 논리 제어를 실현하고 프로그래밍 효율성을 향상시키는 데 도움이 됩니다. 점프 문 사용법을 익히면 다양한 복잡한 논리를 보다 유연하게 처리하고, 코드 중복을 줄이고, 코드 가독성과 실행 효율성을 향상시킬 수 있습니다. 이 기사에서는 Go 언어에서 일반적으로 사용되는 점프 문을 소개하고 특정 코드 예제를 통해 해당 응용 프로그램을 설명합니다. 1.break 문 break 문은 현재 루프에서 벗어나는 데 사용됩니다.

Python의 반복 함수 변수 정의 오류를 해결하는 방법은 무엇입니까? Python의 반복 함수 변수 정의 오류를 해결하는 방법은 무엇입니까? Jun 25, 2023 am 11:59 AM

Python에서 함수 변수의 중복 정의 오류는 일반적인 문제입니다. 동일한 이름의 변수가 함수에 반복적으로 정의되면 Python에서 "localvariable'xxxx'redefinition" 오류가 발생합니다. 이 오류는 일반적으로 함수 내부와 외부에서 변수 이름이 중복되어 발생합니다. Python에서는 변수 범위를 로컬 범위와 전역 범위로 구분합니다. 함수에서 변수를 정의하면 해당 변수는 기본적으로 지역 변수로 지정되며 해당 함수에서만 사용할 수 있습니다.

Golang 변수 정의 사양 및 기술 Golang 변수 정의 사양 및 기술 Jan 13, 2024 pm 03:43 PM

Golang의 변수 정의에 대한 사양 및 기술 개요: Golang에서 변수는 프로그램의 가장 기본적인 데이터 저장 단위입니다. 변수 정의 규칙과 기술을 올바르게 사용하면 코드 가독성, 유지 관리성 및 성능이 향상될 수 있습니다. 이 기사에서는 Golang의 변수 정의에 대한 몇 가지 사양과 기술을 소개하고 구체적인 코드 예제를 제공합니다. 변수 명명 규칙: Golang에는 변수 명명 규칙이 있습니다. 변수 이름은 camelCase를 사용해야 하며 첫 글자는 소문자여야 합니다. Private 변수인 경우 Camel Case로 이름을 지정해야 합니다.

See all articles