2011-09-26 4 views
2

이것은 내가 잃어 버렸기 때문에 온 전성 검사입니다.이상한 프로그램 및 디버거 if 문 동작

나는 열거 형 상태 구성원을 주어진 값과 비교하고 bool을 반환하는 방법 IsCaptured()을 가지고 있습니다. 드래그 시작 메시지를 보내고 드래그 작업을 시작해야하는지 결정하기 위해 마우스 임계 값 검사와 함께이 값을 사용합니다. 문제는 마우스가 움직여서는 안되는 경우에 트리거되는 것입니다. 다음과 같이 내가 추적 메시지를 추가했습니다 :

TRACE(L"%s\n", (IsCaptured()) ? L"true" : L"false"); 
CPoint delta = pt - m_trackMouse; 
static CPoint thresh(GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG)); 

if (IsCaptured() && 
    abs(delta.x) >= thresh.x || abs(delta.y) >= thresh.y) 
{ 
    TRACE(L"%s\n", (IsCaptured()) ? L"true" : L"false"); 
    // Send message to enter drag mode 
    bool bDrag = ::SendMessage(m_trackWnd, WM_DD_BEGIN, ::GetDlgCtrlID(m_trackWnd), (LPARAM)(void*)&m_info) != 0; 

    // ... 
} 

을 지금 이상한 부분을, 출력은 : 아래로 차단 버튼이있을 때까지

false 
false 

방법은 그렇게하고 m_dragStateNONE로 설정처럼 구현 :

enum { NONE, CAPTURED, DRAGGING }; 
bool IsCaptured() const { return m_dragState == CAPTURED; } 

전체 솔루션을 다시 작성하려고 시도했습니다. VS2010 디버그 64 비트를 실행 중이며 프로그램은 단일 스레드 MFC 응용 프로그램입니다. $ @ #! 여기 가니?

+1

괄호를 사용하는 것은 당신의 친구입니다. :) –

답변

8

출력물에 이상한 점이 없습니다. &&

if (IsCaptured() && 
    abs(delta.x) >= thresh.x || abs(delta.y) >= thresh.y) 

if ((IsCaptured() && abs(delta.x) >= thresh.x) || 
    abs(delta.y) >= thresh.y) 

즉로 해석됩니다 이유 ||보다 높은 우선 순위를 가지고 abs(delta.y) >= thresh.y 조건이 충족되는 경우 전체 if 조건의 결과는 IsCaptured()에 전혀 의존하지 않습니다.

컴파일러는 줄 바꿈에서 사용자의 의도를 "표현"하는 데 신경 쓰지 않습니다. 운영자 우선 순위. 줄 바꿈은하지 않습니다. 당신은 분명히 할 것을 예정하고 무엇

if (IsCaptured() && 
    (abs(delta.x) >= thresh.x || abs(delta.y) >= thresh.y)) 

|| 표현식의 피연산자의 주위에 여분의 중괄호의 위치였다.

(IsCaptured() && abs(delta.x) >= thresh.x || abs(delta.y) >= thresh.y) 

이 :이 등의

+0

+1 1 분 너무 느리다 :) – user786653

+0

나는 우선 순위가 더 높았으므로 false에서 단락 될 것이므로 오른쪽과 거짓 논리에 남았 기 때문에 아무 것도 거짓이어야한다고 생각했다. 나는 약간의 parens를 더할 것이고, 그것이 변경하는 지 알 것이다. – AJG85

+0

beh, beat me : p +1 –

0

먼저 두 개의 false가 첫 번째 추적 행을 참조하지 않아야합니다.

두 번째 추적 라인이 실제로 여기에 false로 인쇄되는 경우 사용자는 손에 고전적인 경쟁 상태가되어 보호해야합니다.

+0

여기에 관련된 스레드가 없습니다. OnMouseMove, OnButtonDown의 입구와 위의 메시지를 보내는 줄에 중단 점이 있습니다. 'OnButtonDown'에 대한 중단 점이 결코 부딪히지 않으면 서'CAPTURED'가 설정되지 않습니다. 반면에 IsCaptured()가 true를 반환하는 것처럼이 과정을 거칩니다. – AJG85

1

생각해

(false && true) || true 

귀하의 IsCaptured()이 진행하는 사실 필요가 없습니다, 그래서 그것은 아마도 두 인쇄물에 거짓이 될 수 있습니다.