or 연산자에 대한 질문인데요..
이상하게 잘 안되는 부분이 있어서 질문드립니다..
아래를 봐주세요..
===========================================================
ValueA, ValueB, Result : Integer;
tmpChk1, tmpChk2 : Boolean;
..................
ValueA := StrToInt(edtValueA.Text);
ValueB := StrToInt(edtValueB.Text);
{ 방법 1
tmpChk1 := ValueA < ValueB;
tmpChk2 := ValueA mod ValueB > 0;
If tmpChk1 or tmpChk2 Then
begin
ShowMessage('연산할 두 숫자를 재입력해주세요!');
end;
}
{ 방법 2
tmpChk1 := ValueA < ValueB or ValueA mod ValueB > 0;
If tmpChk1 Then
begin
ShowMessage('연산할 두 숫자를 재입력해주세요!');
end;
}
=============================================================
위와 같이 두가지 방법으로 같은 결과를 낼수 있는 예제를 만들었는데요..
방법1로 코딩을 하고서 실행을 해보면 잘 되는데요..
방법2로 코딩을 하고서 실행을 해보면
tmpChk1 := ValueA < ValueB or ValueA mod ValueB > 0; 부분에
imcompatible types 에러가 납니다..
방법1을 방법2의 식으로 간단히 줄인다고 하고서 했는데 왜 에러가 나는지
도저히 이해가 안갑니다..
제 생각으로는 0이 잘못되었다고 생각하는데요.. 만약 위의 방법2 대로라면
tmpChk1의 불린 연산을 할때 0을 어떤식으로 해줘야 하는지요?
아마도 ValueA < ValueB 하고 ValueA mod ValueB > 0를 or 연산하실려는 것 같은데...
님의 아래의 코딩을 괄호를 써서 해보면
tmpChk1 := ValueA < ValueB or ValueA mod ValueB > 0;
아래와 같이 됩니다.
tmpChk1 := ValueA < ( ValueB or ( ValueA mod ValueB ) ) > 0;
이런식이죠... tmpChk1 := A < B > C;
당연히 델파이는 이런 식의 계산은 할 수가 없습니다. 사람도 마찬가지지만...
첫번째 방법으로 하면 tmpChk1 := A or B; 이런식으로 제대로 계산할 수 있지만...
연산자에는 우선순위란게 있습니다. 이 우선순위에 따라서 먼저 계산할것과 나중에 계산할것이 정해지는 거죠... 덧셈보다 곱셈을 더 먼저 계산해야한다는...
이렇게 많은 연산자를 쓰실때는 되도록 괄호로 묶으시는게 좋습니다. 확실한 것이라도...
tmpChk1 := ((ValueA < ValueB) or ((ValueA mod ValueB) > 0));
연산자 우선 순위는 아래를 참고하세요...
Precedence of operators
Operators Precedence
@, not first (highest)
*, /, div, mod, and, shl, shr, as second
+, -, or, xor third
=, <>, <, >, <=, >=, in, is fourth (lowest)
^^ 항상 즐코하세요...