#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
했다 블록을 빠져 나왔어? 왜냐하면 정적 변수의 범위는 전체 프로그램에 걸쳐 있기 때문입니다.
입니다. 내부 블록에서 대괄호로 범위를 지닌 새로운 정적 변수를 생성하게됩니다. 외부 정적 변수의 값을 변경하려면'static int a = 20;'이 아니라'a = 20'을 사용하면됩니다. 컴파일러는 컴파일 타임에 변수의 이름을 변경할 수 있습니다. 따라서 두 개의 'a' 변수는 컴파일 시간 후에 완전히 다른 이름을 갖게됩니다. – RPGillespie
그래, 그게 유일한 설명이지만 다시 여기 내 질문은 완전히 새로운 변수가 생겨나는 방법입니다 알아 냈어? 내 외부 (정적 int)의 범위와 가시성이 전체 프로그램에 걸쳐 있다면 내 inner (static int a)는 허용되지 않는 재정의와 같은 오류를보고해서는 안됩니다. 그리고 예, 저는 20 세에 대해 알고 있습니다. 당신은 내가 말하려고하는 것을 이해할 수 있기를 바랍니다. –
같은 이름을 가진 두 변수가 다른 범위로 선언되면 컴파일러는 그 차이를 알아낼 수 있으며 별개의 변수로 처리됩니다. 동일한 이름의 두 변수가 동일한 범위에서 선언 된 경우 컴파일러는 차이점을 파악할 수 없으며 오류를보고합니다. – RPGillespie