이상한 버그가 발견되었습니다 (실제로 버그 일 경우). 동일한 범위에서 나중에 변수를 다시 선언 할 수 있지만 이미 동일한 첫 번째 변수를 사용할 수 있습니다. 그게 정상인가요?재 선언 허용?
이 코드는 오류/경고없이 컴파일되고 작동합니다. 코드 블록을 사용하여 g ++로 컴파일 중입니다.
int main()
{
int test = 0;
if(1)
int test = 0;
return 0;
}
이상한 버그가 발견되었습니다 (실제로 버그 일 경우). 동일한 범위에서 나중에 변수를 다시 선언 할 수 있지만 이미 동일한 첫 번째 변수를 사용할 수 있습니다. 그게 정상인가요?재 선언 허용?
이 코드는 오류/경고없이 컴파일되고 작동합니다. 코드 블록을 사용하여 g ++로 컴파일 중입니다.
int main()
{
int test = 0;
if(1)
int test = 0;
return 0;
}
이 코드 :
if(1){
int test = 0;
}
그래서 범위가 부분 :
if(1)
int test = 0;
은 동일합니다. if
안에있는 test
은 범위 외부의 것과 동일하지 않습니다.
외부 변수 test
에 액세스 할 수 있습니다.
int main()
{
int test = 0;
if(1){
int test = 5;
std::cout << "Inner:" << test<< "\n";
//you can not access the outer test
}
return 0;
}
그래, 나도 알아,하지만 당신은 여전히 첫 번째 변수에 액세스 할 수있는 동안 두 번째 하나는 다시 선언하고있다 ... – Neox
@ Neox 내 편집보기 –
이들은 동일한 범위에 속하지 않습니다. statement_true이 하나의 명령문에 중괄호를 넣지 않았다고해서 if
이 새 범위를 만들지 않는다는 의미는 아닙니다.
글쎄, 나는 중괄호를 넣지 않으면 다음 행만 읽습니다. 마치 중괄호가있는 것처럼. 내가 이해할 수없는 것은 경고없이 재 선언이다. 그러나 어쨌든, 나는 나의 대답을 얻었다. 고맙습니다. – Neox
는이 if
새로운 범위를 생성 있는지 다음보십시오 :
int main()
{
int test = 0;
if(1)
int test = 1;
cout << test;
return 0;
}
을 그래서 specification
당 표준은 같은 수 있습니다이, 그것은 버그가되지 않는다 이름이 지정된 변수가 다른 범위에 존재하도록하며 범위 내에서 변수를 사용할 때 참조 할 변수에 대한 규칙을 정의합니다. 동일한 명명 된 변수는 상위 수준 범위에서 변수를 숨 깁니다 (그림자).
l.e : Variable Shadowing
이것은 동일한 범위가 아닙니다. 범위는 단순히 "{'와'}'s를 계산하는 것이 아닙니다. – hvd
오, 잘 됐네. 그러나 이것은 정상입니까? 이것은 전혀 버그가 아니거나 그렇지 않습니까? 내 말은, 다른 함수에서 선언했는지 이해할 수 있지만 바로 여기에서 첫 번째 변수에 액세스 할 수 있습니다. 어떻게 그리고 왜 이것이 허용됩니까? – Neox
예. 보통이다. – Heto