2012-04-10 3 views
0

두 개의 인접한 튜플을 찾는 std :: vector를 걷는 비교적 간단한 알고리즘을 사용했습니다. X 값의 왼쪽과 오른쪽 튜플을 찾으면 그것들을 삽입 할 수 있습니다. 어떻게 든이 작동이 잠시왜 2 NULL 포인터가 false로 평가되지 않습니까?

std::vector<LutTuple*>::iterator tuple_it; 
    LutTuple* left = NULL; 
    LutTuple* right = NULL; 
    bool found = 0; 

    // Only iterate as long as the points are not found 
    for(tuple_it = lut.begin(); (tuple_it != lut.end() && !found); tuple_it++) { 
    // If the tuple is less than r2 we found the first element 
    if((*tuple_it)->r < r) { 
     left = *tuple_it; 
    } 
    if ((*tuple_it)->r > r) { 
     right = *tuple_it; 
    } 
    if(left && right) { 
     found = 1; 
    } 
    } 

:

std::vector<LutTuple*>::iterator tuple_it; 
    LutTuple* left = NULL; 
    LutTuple* right = NULL; 

    // Only iterate as long as the points are not found 
    for(tuple_it = lut.begin(); tuple_it != lut.end() && !left && !right; tuple_it++) { 
    // If the tuple is less than r2 we found the first element 
    if((*tuple_it)->r < r) { 
     left = *tuple_it; 
    } 
    if ((*tuple_it)->r > r) { 
     right = *tuple_it; 
    } 
    } 

하지 않습니다. 왜 그런가요? 나는이 같은 두 개의 NULL ptrs가 부정 될 때 함께 true로 평가 될 것으로 기대합니다.

+6

http://en.wikipedia.org/wiki/De_Morgan's_laws – HostileFork

답변

4

논리적 인 문제가 있습니다.

첫 번째 스 니펫에는 (본질적으로) !(left && right)이 있습니다.

두 번째 스 니펫에는 !left && !right이 있습니다.

이들은 서로 동일하지 않습니다.

진실 표를 작성하면 !(left && right)(!left || !right)과 동일하다는 것을 알게됩니다.

+0

감사합니다. – Julik

5

두 번째 루프가 발견되면 즉시 종료됩니다. 로 조건을 변경 : 모두 찾을 때까지

tuple_it != lut.end() && !(left && right) 

또는

tuple_it != lut.end() && (!left || !right) 

계속.

0

이 부정되면이 두 개의 NULL ptrs가 함께 참값이 될 것으로 예상됩니다.

이것은 의미가 없습니다. 포인터를 "무효화"하지 말고 불리언 표현식으로 강제 할 때 평가할 것을 기대하십시오. 대신 NULL과 명시 적으로 비교하는 것이 좋습니다.

또한 루프를 계속하기 위해 복잡한 부울 표현식을 별도의 행으로 이동하십시오. 그렇지 않으면 논리적으로 코드를 따라 가기가 매우 어려워집니다.

+2

포인터에서 부울로의 표준 변환은 잘 정의되어 있습니다. 그 사용 여부 또는 명시 적 비교 여부는 순수하게 미적입니다. –

+0

@ 마이크, 제 답변은 가독성을 나타내며 정확성은 아닙니다. 필자는 코드가 작성된대로 "올바르게"작동한다고 확신합니다. 작성자가 기대하는 바를하지 않으므로 문제는 대부분 읽기 쉽고 오류가 발생하기 쉽지 않습니다. –

+1

표준 변환이 읽기 쉽고 오류가 발생하기 쉽다고 쉽게 쉽게 주장 할 수 있습니다. 선택은 순전히 미적이며, 개인적 취향은이 질문과 관련이 없습니다. –

관련 문제