2014-04-09 4 views
-3

변수 : 아래의 X는 case1에서 인쇄 할 수 있지만 case2에서 값 X를 인쇄 할 수없는 이유는 무엇입니까?가변 범위 외부 중첩 루프 C++

std::vector<double> X; 
double a = -1; 

for(int i = 0; i < m; i++){ 
    for(int j = 0; j < n; j++){ 

     double b = 0; 
     if(a <0){ 
      b = a + i*i - 100; 
     } 
     if(b > 0){ 
      X.push_back(b); 
     } 

    } 
std::cout << "case1:" << X.size() << std::endl; 
} 

std::cout << "case2:" << X.size() << std::endl; 
+0

X.size()가 정수를 반환하지 않습니까? – 4pie0

+2

이 작업도 컴파일됩니까? –

+0

'b'가 범위를 벗어나 코드가 컴파일되지 않는다는 사실을 무시하면이 함수의 목적은 무엇입니까? 'a'가 절대로 수정되지 않으므로'm' x'n' 1D 벡터 인'-1'로 끝납니다. 또한'int' 값을'double'의 벡터에 추가하면 아마 하나를 선택해야합니다. – CoryKramer

답변

2

변수 B 만의 복합 문에 존재하는 if 문이

if(b != 0){ 

     X.push_back(b); 
    } 

이름 B는로 정의되지 않기 때문에 경우 컴파일러 초 동안 오류를 발행한다

if(a < 0){ 

     int b = a; 
    } 

문 이 선언적 영역.

당신은 당신의 코드를 다시 작성할 수있는 그런 다음 벡터의 크기가 모든 variavles이 제공 아웃풋이 될 것이다이 코드를 시도 할 경우 적어도

를 컴파일 할 것이라는 다음과 같은 방법으로

std::vector<double> X; 
int a = -1; 

for(int i = 0; i < m; i++){ 
    for(int j = 0; j < n; j++){ 

     int b = 0; 

     if(a < 0){ 

      b = a; 
     } 
     if(b != 0){ 

      X.push_back(b); 
     } 

    } 
} 

std::cout << X.size(); 

에게 니펫을 arre는 적절히 선언되고 초기화됩니다 (m 및 n 포함).

+0

a, b 변수를 무시합니다. X를 참조하십시오. 왜 처음에는 루프 외부에서 인쇄 할 수 있습니까? 그러나 두 번째 for 루프 외부에서 작업하지 마십시오. – user3384116

+0

@ user3384116 내 업데이트 된 게시물 –

0

변수 b은 코드가 작성된 if() 문에만 존재하므로 벡터에 푸시하려고하면 범위가 벗어나 더 이상 액세스 할 수 없습니다. 똑같은 일을하고 싶다면 int bif() 문 위로 움직여도 루프 내부에 남겨두기 만하면됩니다.