itsource

변수 초기화, 정의, 선언 간의 차이

mycopycode 2022. 9. 21. 00:02
반응형

변수 초기화, 정의, 선언 간의 차이

문제를 읽고 선언과 정의의 차이를 알게 되었습니다.그럼 정의는 선언에 초기화를 더한 것과 같습니까?

선언.

선언은 일반적으로 프로그램에 새로운 이름을 도입하는 것을 말한다.예를 들어, 새로운 함수의 「signature」를 기술하는 것으로써, 새로운 함수를 선언할 수 있습니다.

void xyz();

또는 불완전한 유형을 선언합니다.

class klass;
struct ztruct;

마지막으로 오브젝트를 선언합니다.

int x;

C++ 표준에서는 § 3.1/1로 다음과 같이 기술되어 있습니다.

선언문(Clause 7)은 하나 이상의 이름을 번역단위에 도입하거나 이전 선언문에 의해 도입된 이름을 다시 작성할 수 있다.

정의.

정의는 이전에 선언된 이름의 정의입니다(또는 정의와 선언 모두 가능).예를 들어 다음과 같습니다.

int x;
void xyz() {...}
class klass {...};
struct ztruct {...};
enum { x, y, z };

특히 C++ 규격에서는 § 3.1/1에서 다음과 같이 정의하고 있습니다.

선언은 함수의 본문(8.4)을 지정하지 않고 함수를 선언하지 않는 한 정의이며, 외부 지정자(7.1.1) 또는 링크 지정 25(7.5)를 포함하며, 이니셜라이저도 함수 본문도 포함하지 않으며, 클래스 정의(9.2, 9.4)에서 정적 데이터 멤버를 선언한다.e-enum-declaration(7.2), 템플릿파라미터(14.1), 함수정의 선언자가 아닌 함수선언자의 파라미터 선언(8.3.5), 또는 타입 정의 선언(7.1.3), 에일리어스 선언(7.1.3), a-declar_static(.3)이다.7), 빈 선언(Clause 7), 또는 사용 지침(7.3.4)이 있습니다.

초기화

초기화는 건설 시 값의 "할당"을 의미합니다.유형의 일반 개체인 경우T의 형식은 다음과 같습니다.

T x = i;

단, C++에서는 다음과 같은 경우가 있습니다.

T x(i);

또는 다음과 같은 경우도 있습니다.

T x {i};

C++11을 사용합니다.

결론

그럼 정의는 선언에 초기화를 더한 것과 같습니까?

사정에 따라 다르겠지.당신이 무슨 말을 하는지.오브젝트에 대해서 예를 들면 다음과 같습니다.

int x;

이것은 초기화되지 않은 정의입니다.대신에, 초기화를 사용한 정의는 다음과 같습니다.

int x = 0;

어떤 맥락에서 "초기화", "정의" 및 "선언"에 대해 말하는 것은 의미가 없습니다.예를 들어 함수에 대해 말하는 경우 초기화는 큰 의미가 없습니다.

따라서 대답은 "아니오"입니다.정의는 자동으로 선언과 초기화를 의미하지 않습니다.

선언문에는 "이 물건은 어딘가에 존재한다"고 되어 있습니다.

int foo();       // function
extern int bar;  // variable
struct T
{
   static int baz;  // static member variable
};

정의에는 "이것이 여기에 존재합니다.메모리를 만듭니다"라고 기재되어 있습니다.

int foo() {}     // function
int bar;         // variable
int T::baz;      // static member variable

오브젝트 정의 시 초기화는 옵션이며 "이것의 초기값은 다음과 같습니다"라고 말합니다.

int bar = 0;     // variable
int T::baz = 42; // static member variable

대신 선언 시점에서 다음과 같은 일이 발생할 수 있습니다.

struct T
{
   static int baz = 42;
};

…하지만, 그 때문에, 보다 복잡한 기능이 도입되고 있습니다.

C의 경우, 적어도 C11 6.7.5에 따라:

선언은 식별자 집합의 해석 및 속성을 지정합니다.식별자의 정의는 다음과 같은 식별자에 대한 선언입니다.

  • 개체에 대해 해당 개체에 대해 스토리지를 예약합니다.

  • 기능의 경우 기능 본체를 포함한다.

  • 열거 상수의 경우, 는 식별자의 (유일한) 선언이다.

  • typedef 이름의 경우 ID의 첫 번째(또는 유일한) 선언입니다.

C11 6.7.9.8-10에 따라:

initializer는 객체에 저장된 초기값을 지정합니다.자동저장장치를 가진 객체가 명시적으로 초기화되지 않은 경우 그 값은 미확정입니다.

그래서 일반적으로 선언문은 식별자를 도입하고 그에 대한 정보를 제공한다.변수의 경우 정의는 해당 변수에 대한 스토리지를 할당하는 선언입니다.

Initialization은 객체에 저장되는 초기값의 지정으로, 값을 명시적으로 처음 할당했을 때와 반드시 같을 필요는 없습니다.변수를 정의할 때 명시적으로 값을 지정했는지 여부에 관계없이 변수는 값을 가집니다.명시적으로 값을 지정하지 않고 변수에 자동 저장 기능이 있는 경우 초기 값은 지정되지만 이 값은 불확실합니다.정적 스토리지가 있는 경우 유형에 따라 암묵적으로 초기화됩니다(예: 포인터 유형이 늘 포인터로 초기화되거나 산술 유형이 0으로 초기화되는 등).

따라서 초기값을 지정하지 않고 자동변수를 정의하면 다음과 같이 됩니다.

int myfunc(void) {
    int myvar;
    ...

정의(정의는 선언이므로 선언)를 정의하지만 초기화는 하지 않습니다.따라서 정의는 선언과 초기화와 동일하지 않습니다.

"그러면 정의는 선언과 초기화와 같은 것을 의미합니까?"

반드시 다음과 같은 변수가 초기화되지 않은 선언일 수도 있습니다.

 void helloWorld(); //declaration or Prototype.

 void helloWorld()
 {
    std::cout << "Hello World\n";
 } 

언급URL : https://stackoverflow.com/questions/23345554/the-differences-between-initialize-define-declare-a-variable

반응형