2013-07-27 5 views
0

return 진술에 대해 새로운 것을 발견했습니다. forif과 조합하여이 강제 디버거는 함수에서 제어를 반환하지 않고 대신 다음 문으로 진행하지만 함수 내부에 스택하고 조건이 참이 될 때까지 for을 반복합니다. 예를 들어 :C++ return 문이 이상한 동작입니까?

struct Position 
{ 
    int position; 
    int value; 
}; 

vector<Position> find_all(vector<Position>& v, int value) 
{ 
    vector<Position> res; 
    for (auto p = v.begin(); p != v.end(); ++p) 
     if (p->value == value) 
      res.push_back(*p); 

    return res; 
} 

int main() 
{ 
    vector<Position> v { { 0, 0 }, { 1, 1 }, { 2, 0 }, { 3, 3 }, 
         { 4, 4 }, { 5, 6 }, { 6, 0 }, { 7, 2 } }; 
    find_all(v, 0); 
    cin.get(); 
    return 0; 
} 

당신이 return res;에 디버거를 설정하고 함수가 루프 종료에 대한 때까지 함수 내에서이 실행을 계속이 방법으로 단계 때, 코드를 디버깅을 시작하면, 대신 돌아갑니다. if 문에 중괄호를 설정하면 정상적으로 작동합니다.

이해가 안됩니다. 어떤 일이 일어 났는지, 왜 그런지 설명해주십시오. 나는 VisualC++을 사용하고 있지만이 유형은 Stroustrup 서적에서 return 사용법을 발견했습니다.

+1

""if "문에서 중괄호를 설정하면 정상적으로 작동합니다. *"-이 코드를 표시 할 수 있습니까? – Maroun

+1

아마도 IDE/디버거의 "기능"일 것입니다. 확실히 C++ 언어와 관련이 없습니다. –

+0

& Maroun Maroun vector find_all (벡터 & v, int 값) { 벡터 res;(자동 p = v.begin(); p! = v.end(); ++ p) if (p- 값 == 값) { res.push_back (* p); } return res; } – ChaosDev

답변

5

이것은 기계어 코드의 실행을 소스 코드로 추적하려는 소스 수준 디버거의 증상입니다. for 루프의 조건은 p != v.end()이며 실제로는 while 조건이며 각 반복마다 평가됩니다. 이 조건 평가는 일반적으로 루프의 끝 부분에 있습니다 (적어도 MSVC에서). 귀하의 예제에서는 루프 끝에 코드가 없으므로 디버거에서 루프 다음에 오는 문으로 "현재 줄"을 표시합니다 (return res; 줄).

for 루프 본문 주위에 중괄호를 넣으면 새 줄에 닫는 중괄호를 넣으면 디버거에 조건과 연결할 코드 줄이 표시되고 예상되는 동작이 표시됩니다.

vector<Position> find_all(vector<Position>& v, int value) 
{ 
    vector<Position> res; 
    for (auto p = v.begin(); p != v.end(); ++p) 
    { 
     if (p->value == value) 
      res.push_back(*p); 
    } 

    return res; 
} 

디버거는 현재 라인의 근사치를 나타내고 있음을 기억하라. 디버그 모드에서는 대개 매우 정확하지만 "이상하게 보입니다"와 같은 경우가 있습니다. 릴리스 빌드를 단계별로 실행하여 최적화를하면 "현재 라인"이 주위를 뛰어 넘는 것처럼 보입니다.

관련 문제