응답이 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);`
}
응답이 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);`
}
스택 세그먼트에있을 것입니다 데이터 세그먼트 에있을 것입니다. 따라서 인쇄 할 때 로컬 변수가 인쇄됩니다. 전역 변수를 수정하려면
, 당신은 아이디어가 여기에 언급 사용할 수 있습니다
당신은 (i
함으로써 그것을 숨기고, 글로벌 변수와 같은 이름의 지역 변수를 선언 한 로컬 변수가 선언 된 바로 그 범위 내에서 사용되는 경우) 전역 변수가 아닌 로컬 변수를 참조하십시오.
가장 자연스럽고 논리적 인 해결책은 다음과 같습니다. 가능하면 항상 그렇게하지 마십시오.
Shadowing. 전역 변수 i = 0
은 로컬 i = 2
에 의해 음영 처리됩니다.
이름 충돌을 피하십시오.
한편, void main() {}
은 표준 C가 아닙니다 (프로그램이 호스트 환경, 즉 OS 상단에서 실행된다고 가정). 대신 int main(void) { return 0; }
을 사용하십시오. Reference.Another one.
사실'int main()'도 표준 C가 아닙니다. 인수를 신경 쓰지 않는다면'int main (void)'를 사용해야합니다. – user694733
@ user694733 네 말이 맞아, 고마워. 내 게시물을 개선했습니다. –
가변 범위입니다. 동일한 유형의 여러 변수가 선언 된 경우 가장 가까운 범위에서 사용할 수있는 연산자에 액세스합니다.
범위 분석은 컴파일 타임에 발생합니다. 컴파일러가 코드에서 액세스 할 때 변수 선언을 검색하면 가장 가까운 범위에서 먼저 확인한 다음 위로 이동합니다. 전역 변수는 마지막에 액세스됩니다.
'i == 2; ':: i == 0;' – MFH
당신은 그것을 숨겼습니다. 다른 변수에 대해 동일한 식별자를 사용하여 'i'를 숨 깁니다. 왜 그런 짓을 한거야? –
질문과는 별도로'void main()'시그너처를 절대로 사용해서는 안됩니다. 'int main()'을 대신 사용하십시오. – Shaac