2016. 3. 8.

if문 사용시 오류나거나 자주 헷갈리는 부분 정리

[출처:http://autohotkey.co.kr/b/6-260]


IF사용시 예전에는 제대로 안될때가 있어 %붙여보고 소괄호붙여보고..이래저래 헷갈렸었는데
쓰다보니 오토핫키상 오류는 원래 없었던듯 싶습니다.

여러가지 IF의 사용법에 대해 써보겠습니다.



1. 변수와 문자열,숫자 한개비교

변수=문자열
if 변수=문자열
     msgbox ok
else
     msgbox fail
=>ok출력

변수=3
if 변수=3
     msgbox ok
else
     msgbox fail
=>ok출력
하나의 변수에 대해선 문자열이든 숫자든 그냥 비교하시면됩니다.



2. 변수와 변수비교

변수1=4
변수2=4
if 변수1=변수2
     msgbox ok
else
     msgbox fail
=>fail출력

이렇게 하면 안됩니다.
두가지 방법이 있습니다.

변수1=4
변수2=4
if 변수1=%변수2%
     msgbox ok
else
     msgbox fail
=>ok출력

변수1=4
변수2=4
if (변수1=변수2)
     msgbox ok
else
     msgbox fail
=>ok출력

여기서보면 유추할수있듯이, %%로 묶어주면 변수로 취급됩니다.
그리고 ()소괄호로 묶어주면 안에있는 문자열은 변수로 취급됩니다.

그렇다면 한가지 둘다 %%로묶어주면 어떨까요?
변수1=4
변수2=4
if %변수1%=%변수2%
     msgbox ok
else
     msgbox fail
=>fail출력

안됩니다. 여기서보면 첫번째써진 문자열은 변수로 자동취급됨을 알수있습니다.
그렇다면, 소괄호로 묶인상태에서 문자열 비교는 어떻게할까요?



3. 소괄호 내의 변수와 문자열비교

변수=문자열
if (변수="문자열")
     msgbox ok
else
     msgbox fail
=>ok출력
간단합니다. ""로 묶어주면됩니다.



4. 두개 이상의 조건비교

변수1=4
변수2=5
변수3=6
if 변수1=4 and 변수2=5 and 변수3=6
     msgbox ok
else
     msgbox fail
=>fail출력

변수1=4
변수2=5
변수3=6
if (변수1=4 and 변수2=5 and 변수3=6)
     msgbox ok
else
     msgbox fail
=>ok출력

변수1=4
변수2=5
변수3=6
if (변수1=4) and 변수2=5 and 변수3=6
     msgbox ok
else
     msgbox fail
=>ok출력

fail의 원인을 보자면, =과 and연산자 사이의 연산우선순위에 있는듯합니다. = 대신 다른 비교문으로 실행하면 정상적으로 진행이 가능했습니다.

변수1=4
변수2=5
if 변수1<=5 and 변수2<=5
     msgbox ok
else
     msgbox fail
=>ok출력

변수1=4
변수2=5
변수3=6
if 변수1<=4 and 변수2<=7 and 변수3=7
     msgbox ok
else
     msgbox fail
=>ok출력(원래는 fail이 되야함 변수3은6이므로)

변수1=4
변수2=5
변수3=6
if (변수1<=4) and 변수2<=7 and 변수3=7
     msgbox ok
else
     msgbox fail
=>fail출력
이렇게 해야지 정상적으로 출력되었습니다.
여기서 소괄호 영역은 변수1까지든 변수2까지든 변수3까지 전체든 상관없습니다.

이렇게보니 여러개 비교할땐, 정확히 소괄호를 사용해주는게 편리할것같습니다.
물론 소괄호 영역에서 문자열 비교는 ""사용하는것 까먹으면 안되겠죠 ^^



5. 변수만 비교

변수=0
if 변수
     msgbox ok
else
     msgbox fail
=>fail출력

변수=
if 변수
     msgbox ok
else
     msgbox fail
=>fail출력

변수가 0이거나 비어있는경우를 제외하곤 무조건 성공합니다.
그러므로 흔히 내장변수로 제공되는 errorlevel은 특별한경우가 아니면
if errorlevel처럼 간단히 써도 무방합니다.



6. 함수를 if문에서 활용하기
개인이 만든 함수로 참거짓을 판단해야할 경우가 있습니다.
그럴때도 if문에서 사용이 가능합니다.

변수=3
if 결과:=자연수판단(변수)   ;자연수판단 함수에 변수값 3을 넣고 결과변수에 그값을 반환받습니다.
     msgbox ok
else
     msgbox fail
msgbox % 결과  ;여기서 1출력
=>ok출력(결과는 1출력)

변수2=-1
if 결과:=자연수판단(변수2)
     msgbox ok
else
     msgbox fail
msgbox % 결과
=>fail출력(결과는 0출력)

자연수판단(변수)
{
     if 변수>0
          return 1
     else
          return 0
}

위에서 보시다싶이 함수로 반환받는 값을 바로 저장하면서 참거짓 여부를 판단할수 있습니다.




+ 추가정리)


오늘 공부하닥 우연히 발견했네요. Ternary operator
예) var := x>y ? 2 : 3

변수 세 개를 비교한 후에 값을 저장하는 건데요, 이걸 써보니까 스크립트 내용을 상당히 줄일 수 있더라구요 ^^
(This can improve a script's readability and maintainability)


&&는 And의 의미로 모두 참일떄 값을 참으로 반환하고
하나라도 거짓이면 거짓으로반환합니다.

||는 OR의 의미로 모두거짓일때 거짓을 반환하고
하나라도 참이면 참을반환합니다.

a=1
if (e=3 || a=1 || b=2)
msgbox, ro
return
e=3
a=1
b=2
if (e=3 && a=1 && b=2)
msgbox, ro
return