2013-10-03 3 views
0

응답이 i = 2입니다. 하지만 내 질문은 i = 0에 무슨 일입니까 ??? 내 이해 에 따르면 전 = 0 내가 = 2 로컬 변수 i 글로벌 변수 i을 숨 깁니다C와 같은 전역 변수 및 로컬 변수

#include <stdio.h> 
int i = 0; 
void main() 
{ 
    int i = 2; 
    printf("i value is %d\n",i);` 
} 
+3

'i == 2; ':: i == 0;' – MFH

+0

당신은 그것을 숨겼습니다. 다른 변수에 대해 동일한 식별자를 사용하여 'i'를 숨 깁니다. 왜 그런 짓을 한거야? –

+4

질문과는 별도로'void main()'시그너처를 절대로 사용해서는 안됩니다. 'int main()'을 대신 사용하십시오. – Shaac

답변

6

스택 세그먼트에있을 것입니다 데이터 세그먼트 에있을 것입니다. 따라서 인쇄 할 때 로컬 변수가 인쇄됩니다. 전역 변수를 수정하려면

, 당신은 아이디어가 여기에 언급 사용할 수 있습니다

How can I access a shadowed global variable in C?

0

당신은 (i함으로써 그것을 숨기고, 글로벌 변수와 같은 이름의 지역 변수를 선언 한 로컬 변수가 선언 된 바로 그 범위 내에서 사용되는 경우) 전역 변수가 아닌 로컬 변수를 참조하십시오.

가장 자연스럽고 논리적 인 해결책은 다음과 같습니다. 가능하면 항상 그렇게하지 마십시오.

3

Shadowing. 전역 변수 i = 0은 로컬 i = 2에 의해 음영 처리됩니다.

이름 충돌을 피하십시오.

한편, void main() {}은 표준 C가 아닙니다 (프로그램이 호스트 환경, 즉 OS 상단에서 실행된다고 가정). 대신 int main(void) { return 0; }을 사용하십시오. Reference.Another one.

+2

사실'int main()'도 표준 C가 아닙니다. 인수를 신경 쓰지 않는다면'int main (void)'를 사용해야합니다. – user694733

+0

@ user694733 네 말이 맞아, 고마워. 내 게시물을 개선했습니다. –

0

가변 범위입니다. 동일한 유형의 여러 변수가 선언 된 경우 가장 가까운 범위에서 사용할 수있는 연산자에 액세스합니다.

범위 분석은 컴파일 타임에 발생합니다. 컴파일러가 코드에서 액세스 할 때 변수 선언을 검색하면 가장 가까운 범위에서 먼저 확인한 다음 위로 이동합니다. 전역 변수는 마지막에 액세스됩니다.