2016-06-07 2 views
1

이상한 버그가 발견되었습니다 (실제로 버그 일 경우). 동일한 범위에서 나중에 변수를 다시 선언 할 수 있지만 이미 동일한 첫 번째 변수를 사용할 수 있습니다. 그게 정상인가요?재 선언 허용?

이 코드는 오류/경고없이 컴파일되고 작동합니다. 코드 블록을 사용하여 g ++로 컴파일 중입니다.

int main() 
{ 
    int test = 0; 
    if(1) 
     int test = 0; 
    return 0; 
} 
+6

이것은 동일한 범위가 아닙니다. 범위는 단순히 "{'와'}'s를 계산하는 것이 아닙니다. – hvd

+0

오, 잘 됐네. 그러나 이것은 정상입니까? 이것은 전혀 버그가 아니거나 그렇지 않습니까? 내 말은, 다른 함수에서 선언했는지 이해할 수 있지만 바로 여기에서 첫 번째 변수에 액세스 할 수 있습니다. 어떻게 그리고 왜 이것이 허용됩니까? – Neox

+1

예. 보통이다. – Heto

답변

2

이 코드 :

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; 
} 
+0

그래, 나도 알아,하지만 당신은 여전히 ​​첫 번째 변수에 액세스 할 수있는 동안 두 번째 하나는 다시 선언하고있다 ... – Neox

+0

@ Neox 내 편집보기 –

2

이들은 동일한 범위에 속하지 않습니다. statement_true이 하나의 명령문에 중괄호를 넣지 않았다고해서 if이 새 범위를 만들지 않는다는 의미는 아닙니다.

참조 : http://en.cppreference.com/w/cpp/language/if

+0

글쎄, 나는 중괄호를 넣지 않으면 다음 행만 읽습니다. 마치 중괄호가있는 것처럼. 내가 이해할 수없는 것은 경고없이 재 선언이다. 그러나 어쨌든, 나는 나의 대답을 얻었다. 고맙습니다. – Neox

1

는이 if 새로운 범위를 생성 있는지 다음보십시오 :

int main() 
{ 
    int test = 0; 
    if(1) 
     int test = 1; 
    cout << test; 
    return 0; 
} 

을 그래서 specification

1

당 표준은 같은 수 있습니다이, 그것은 버그가되지 않는다 이름이 지정된 변수가 다른 범위에 존재하도록하며 범위 내에서 변수를 사용할 때 참조 할 변수에 대한 규칙을 정의합니다. 동일한 명명 된 변수는 상위 수준 범위에서 변수를 숨 깁니다 (그림자).

l.e : Variable Shadowing