2014-10-03 3 views
-1
#include<stdio.h> 
int main(){ 
    int a=10; 
    { printf("%d",a); 
     int a=20; 
     printf("%d",a); 
    } 
    printf(" %d",a); 
    return 0; 
} 

Output:10 20 10 

위의 코드에서 변수 a (내부 블록 내부)의 가시성은 해당 블록 내에서만 범위를 가지므로 특정 출력을 얻음을 이해합니다. 그러나 그 블록 외부에서 선언 된 변수 a는 내부 블록 안에서도 범위를 가져야합니다 ... 따라서 다시 입력 할 수있는 방법은 무엇입니까 int a=20; "redefined of a"와 같은 오류를주지 않아야합니까? "이전 선언은 여기에있었습니다." 내가자동 및 정적 변수와 관련된 혼동

int b=10; 
int b=15; 

를 사용하는 경우 내 두 번째 문제는 왜, 이것은 "는의 재정"과 같은 오류를받지 못했습니다에 대한 이전 코드와 같은 의심에서이

void main() { 
static int a=10; 

    { 
     printf("%d ",a); 
     static int a=20; 
     printf("%d",a); 
    } 
    printf(" %d",a); 

} 

외에도처럼 이 코드와 관련된 나의 의심. 위의 코드에 대한

내가 같은 Output: 10 20 10 얻을하지만 내가 기대 한 것은 내가 그 후에도 동일한 값을 안 한 번 정적 INT A가 20로 다시 초기화 내부 블록에서 의미

10 20 20 

했다 블록을 빠져 나왔어? 왜냐하면 정적 변수의 범위는 전체 프로그램에 걸쳐 있기 때문입니다.

+0

입니다. 내부 블록에서 대괄호로 범위를 지닌 새로운 정적 변수를 생성하게됩니다. 외부 정적 변수의 값을 변경하려면'static int a = 20;'이 아니라'a = 20'을 사용하면됩니다. 컴파일러는 컴파일 타임에 변수의 이름을 변경할 수 있습니다. 따라서 두 개의 'a' 변수는 컴파일 시간 후에 완전히 다른 이름을 갖게됩니다. – RPGillespie

+0

그래, 그게 유일한 설명이지만 다시 여기 내 질문은 완전히 새로운 변수가 생겨나는 방법입니다 알아 냈어? 내 외부 (정적 int)의 범위와 가시성이 전체 프로그램에 걸쳐 있다면 내 inner (static int a)는 허용되지 않는 재정의와 같은 오류를보고해서는 안됩니다. 그리고 예, 저는 20 세에 대해 알고 있습니다. 당신은 내가 말하려고하는 것을 이해할 수 있기를 바랍니다. –

+0

같은 이름을 가진 두 변수가 다른 범위로 선언되면 컴파일러는 그 차이를 알아낼 수 있으며 별개의 변수로 처리됩니다. 동일한 이름의 두 변수가 동일한 범위에서 선언 된 경우 컴파일러는 차이점을 파악할 수 없으며 오류를보고합니다. – RPGillespie

답변

2

첫 번째 문제에 대한 대답 : 가변 섀도 잉이라고합니다. 위키 : 소정 범위 (결정 블록, 방법, 또는 내부 클래스)에서 선언 된 변수 범위 외부에서 선언 변수와 동일한 이름을 갖는 경우

변수 그림자가 발생한다.

간단히 말해서 같은 이름의 변수를 만들었지 만 다른 범위의 변수는 이전 변수를 음영 처리합니다.

// static1.cpp 
// compile with: /EHsc 
#include <iostream> 

using namespace std; 
void showstat(int curr) { 
    static int nStatic; // Value of nStatic is retained 
          // between each function call 
    nStatic += curr; 
    cout << "nStatic is " << nStatic << endl; 
} 

int main() { 
    for (int i = 0; i < 5; i++) 
     showstat(i); 
} 

출력 :

nStatic는 0

nStatic 1

nStatic 3

nStatic이다 - 두 번째 문제에 대한

여기 좋은 예이며 6

nStatic은 1

+0

C#의 설계자는 이것을 금지하기로 결정했습니다. http://ericlippert.com/2014/09/25/confusing-errors-for-a-confusing-feature-part-one/#more-2371 –

+2

gcc에서 경고를 활성화 할 수 있습니다. http : // stackoverflow .com/a/958646/2394945 –

+0

Nailed it. 고맙습니다. 하지만 개발자가 왜 가변적 인 섀도 잉을 사용 하는지를 이해하지 못한다고해서 이점이없는 것처럼 보입니다. –

1
#include<stdio.h> 
int main(){ 
    int a=10; 
    { printf("%d",a); 
     int a=20; 
     printf("%d",a); 
    } 
    printf(" %d",a); 
    return 0; 
} 

두 번째 a은 이미 알고있는 것처럼 보입니다. 동일한 ""에 같은 이름의 두 변수를 정의한 경우 을 정의한 경우에만 "재정의"오류가 적용됩니다.

void main() { 
    static int a=10; 

    { 
     printf("%d ",a); 
     static int a=20; 
     printf("%d",a); 
    } 
    printf(" %d",a); 

} 

내부 블록 내부의 a 역시 해당 블록 내에 범위가 있습니다. 동일한 블록을 다시 입력하면 astatic으로 선언했기 때문에 계속 동일한 값을 갖습니다. 그러나 블록 외부에서는 첫 번째 변수 a의 값을 사용합니다. 변수 범위평생 사이의 차이를 보여줍니다.

+0

+1 빠른 답장을 보내 주셔서 감사합니다. 정적 사용에 대한 의문점을 해결했습니다. –

관련 문제