sourcecode

c와 c++의 컨텍스트에서 static 변수, auto 변수, global 변수 및 local 변수의 차이

copyscript 2022. 8. 29. 22:19
반응형

c와 c++의 컨텍스트에서 static 변수, auto 변수, global 변수 및 local 변수의 차이

제가 좀 static,auto,global ★★★★★★★★★★★★★★★★★」local수입니니다다

선가 ...static변수는 함수 내에서만 액세스할 수 있지만 함수가 반환된 후에도 여전히(메모리에 저장됨) 존재합니다.

저는 또 '아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.local가 있을까요?러면면 어이? ???? ????

여기에는 다음 두 가지 개념이 있습니다.

  • scope: 이름에 액세스할 수 있는 위치를 결정합니다.
  • 저장 기간: 변수가 생성 및 삭제되는 시기를 결정합니다.

로컬 변수(패디하게 블록 범위를 가진 변수)는 선언된 코드 블록 내에서만 액세스할 수 있습니다.

void f() {
    int i;
    i = 1; // OK: in scope
}
void g() {
    i = 2; // Error: not in scope
}

글로벌 변수(파일 범위(C) 또는 네임스페이스 범위(C++)를 가진 변수)는 선언 후 언제든지 액세스할 수 있습니다.

int i;
void f() {
    i = 1; // OK: in scope
}
void g() {
    i = 2; // OK: still in scope
}

(C++에서는 네임스페이스를 닫았다가 다시 열 수 있고 현재 이외의 스코프에 액세스할 수 있으며 이름에도 클래스 스코프가 있을 수 있기 때문에 상황은 더욱 복잡합니다.하지만 그것은 매우 주제에서 벗어나고 있습니다.)

자동 변수(자동 저장 기간이 있는 변수)는 실행이 범위를 벗어나면 수명이 끝나는 로컬 변수이며 범위를 다시 입력하면 다시 생성됩니다.

for (int i = 0; i < 5; ++i) {
    int n = 0;
    printf("%d ", ++n);  // prints 1 1 1 1 1  - the previous value is lost
}

정적 변수(정신적으로, 정적 저장 기간이 있는 변수)의 수명은 프로그램이 끝날 때까지 지속됩니다.로컬 변수인 경우 실행이 범위를 벗어나도 값이 유지됩니다.

for (int i = 0; i < 5; ++i) {
    static int n = 0;
    printf("%d ", ++n);  // prints 1 2 3 4 5  - the value persists
}

에 주의:static키워드에는 정적 저장 기간 외에 다양한 의미가 있습니다.글로벌 변수 또는 함수에서는 다른 변환 단위에서 액세스할 수 없도록 내부 링크를 제공합니다.C++ 클래스 멤버에서는 개체당 인스턴스가 아닌 클래스당 인스턴스가 하나씩 있음을 의미합니다.또한 C++에서는auto키워드는 더 이상 자동 저장 기간을 의미하지 않습니다. 이제 변수의 이니셜라이저에서 추론된 자동 유형을 의미합니다.

, 이것은 되어 있기 .


이러한 변수는 변수를 생성하는 특정 함수 내부에만 존재합니다.다른 기능이나 메인 프로그램에는 알려져 있지 않습니다.이와 같이, 통상은 스택을 사용해 실장됩니다.로컬 변수를 생성한 함수가 완료되면 로컬 변수는 더 이상 존재하지 않습니다.함수가 실행되거나 호출될 때마다 다시 생성됩니다.


이러한 변수는 프로그램을 구성하는 모든 기능을 통해 액세스할 수 있습니다(알려진 변수입니다.메모리 위치를 변수 이름과 관련지어 실장합니다.기능이 호출되어도 재생성되지 않습니다.

/* Demonstrating Global variables  */
    #include <stdio.h>
    int add_numbers( void );                /* ANSI function prototype */

    /* These are global variables and can be accessed by functions from this point on */
    int  value1, value2, value3;

    int add_numbers( void )
    {
        auto int result;
        result = value1 + value2 + value3;
        return result;
    }

    main()
    {
        auto int result;
        value1 = 10;
        value2 = 20;
        value3 = 30;        
        result = add_numbers();
        printf("The sum of %d + %d + %d is %d\n",
            value1, value2, value3, final_result);
    }


    Sample Program Output
    The sum of 10 + 20 + 30 is 60

선언을 신중하게 배치함으로써 글로벌 변수의 범위를 제한할 수 있습니다.선언에서 현재 소스 파일이 끝날 때까지 볼 수 있습니다.

#include <stdio.h>
void no_access( void ); /* ANSI function prototype */
void all_access( void );

static int n2;      /* n2 is known from this point onwards */

void no_access( void )
{
    n1 = 10;        /* illegal, n1 not yet known */
    n2 = 5;         /* valid */
}

static int n1;      /* n1 is known from this point onwards */

void all_access( void )
{
    n1 = 10;        /* valid */
    n2 = 3;         /* valid */
}

★★★
정적 개체는 생성된 시점부터 프로그램이 끝날 때까지 지속되는 개체입니다.을 사용하다그러나 글로벌 개체, 네임스페이스 범위의 개체, 클래스/함수 내에서 정적으로 선언된 개체 및 파일 범위에서 선언된 개체는 정적 개체에 포함됩니다.정적 개체는 프로그램 실행이 중지되면 삭제됩니다.
이 튜토리얼 리스트를 보시기 바랍니다.

AUTO :
C, C++

(자동 변수라고 불립니다).

코드 블록 내에서 선언된 모든 변수는 기본적으로 자동이지만 auto 키워드를 사용하여 명시할 수 있습니다.[주 1] 초기화되지 않은 자동변수는 해당 유형의 유효한 값을 할당할 때까지 정의되지 않은 값을 가집니다.[1]

auto 대신 스토리지 클래스 레지스터를 사용하는 것은 컴파일러가 프로세서 레지스터에 변수를 캐시하기 위한 힌트입니다.참조 연산자(&)가 변수 또는 그 하위 컴포넌트에 사용되는 것을 허용하지 않는 것 외에 컴파일러는 힌트를 자유롭게 무시할 수 있습니다.

C++에서는 자동변수의 생성자가 실행이 선언 위치에 도달하면 호출된다.소멸자는 지정된 프로그램 블록의 끝에 도달하면 호출됩니다(프로그램 블록은 중괄호로 둘러싸여 있습니다).이 기능은 파일을 열고 자동으로 닫거나 메모리를 비우는 등의 리소스 할당 및 할당 해제를 관리하는 데 자주 사용됩니다.Wikipedia 참조

staticC및 C 단어입니다. static함수의 컨텍스트에서 변수는 콜 간에 값을 유지하는 변수입니다.이치노

로컬 변수는 함수의 수명 동안 또는 그 주변 범위가 무엇이든 간에 유지됩니다.예를 들어 다음과 같습니다.

void foo()
{
    int i, j, k;
    //initialize, do stuff
} //i, j, k fall out of scope, no longer exist

이 스코핑이 의도적으로 사용되는 경우가 있습니다.{ }★★★★

{ 
   int i, j, k;
   //...
} //i, j, k now out of scope

글로벌 변수는 프로그램 기간 동안 존재합니다.

autoC++로 하다 autoC는 로컬 변수를 지정하는 (여유한) 방식입니다.에서는 C++11 입니다.auto이제 값/표현의 유형을 자동으로 도출하기 위해 사용됩니다.

변수가 클래스 내에서 static으로 선언되면 해당 변수는 해당 클래스의 모든 객체에 대해 공유 변수가 됩니다.즉, 변수는 어느 객체에나 더 오래 고유합니다.예: -

#include<iostream.h>
#include<conio.h>
class test
{
    void fun()
    {
        static int a=0;
        a++;
        cout<<"Value of a = "<<a<<"\n";
    }
};
void main()
{
    clrscr();
    test obj1;
    test obj2;
    test obj3;
    obj1.fun();
    obj2.fun();
    obj3.fun();
    getch();
}

이 프로그램은 다음 출력을 생성합니다. -

Value of a = 1
Value of a = 2
Value of a = 3

글로벌하게 선언된 스태틱 변수도 마찬가지입니다.위의 코드는 변수를 외부 함수 void fun()으로 선언한 경우에도 동일한 출력을 생성합니다.

static 키워드를 삭제하고를 비스타틱로컬/글로벌 변수로 선언한 경우 출력은 다음과 같습니다.

Value of a = 1
Value of a = 1
Value of a = 1

차이점은 스태틱 변수가 그 변수라는 것입니다.이 변수에서는 함수의 콜 간에 값을 유지할 수 있습니다.단, 로컬 변수의 경우 범위는 block/function lifetime까지입니다.

예:

#include <stdio.h>

void func() {
    static int x = 0; // x is initialized only once across three calls of func()
    printf("%d\n", x); // outputs the value of x
    x = x + 1;
}

int main(int argc, char * const argv[]) {
    func(); // prints 0
    func(); // prints 1
    func(); // prints 2
    return 0;
}

함수 종료 후 로컬 변수가 메모리에 존재하지 않습니다.
, <고객명>님static변수는 모든 기능에 관계없이 프로그램 수명 동안 메모리에 할당된 상태로 유지됩니다.

하신 내용에 , ★★★★★★★★★★★★★★★★★★★★★★★★★★★.static할 수 .class 함수 " " "의 " "에 있습니다.namespace또는 파일 범위.이치노그것은, 머지않아 발생하는 초기화일 뿐입니다.

언급URL : https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-c-a

반응형