괄호를 쳐줘야 될 것 같습니다.
예시: (a < b ? a : b)
1149번 - RGB거리
괄호를 쳐줘야 될 것 같습니다.
예시: (a < b ? a : b)
아 그렇네요...
근데 지금까지는 괄호를 안 쳐줘도 문제가 없이 잘 돌아갔는데
이 문제에서만 영향을 받는 이유가 뭘까요?
다른 문제의 코드를 올려주세요.
이 코드입니다.
#define으로 정의한 것은 컴파일 타임에 해당 매크로의 내용이 그대로 대체되어 들어가는 것입니다. 문제가 발생할지 안 할지는 그렇게 대체된 문자열이 코드상에서 문법적으로 어떤 상태인가에 따라 결정됩니다.
질문글의 코드의 경우 매크로를 그대로 코드에 대체해 넣으면 아래와 같이 변합니다. 그런데 덧셈 연산자는 삼항 연산자보다 우선순위가 높으므로, 문법적으로 그 아래와 같이 묶이게 됩니다. 즉, arr[i][1]은 본래 의도대로라면 dp[i-1][2]와 dp[i-1][3] 중 더 작은 것에 반드시 더해져야 하는 것이지만, 매크로에 의해 대체된 코드는 dp[i-1][2]이 더 작으면 dp[i-1][2]가 dp[i][1]에 대입되고, 그렇지 않으면 dp[i-1][3]+arr[i][1]이 dp[i][1]에 대입되는 것으로 의미가 변하게 됩니다.
반면에 답글의 코드의 경우 이 매크로를 그대로 코드에 대체해 넣어도 의도한 것과 달라지는 부분이 없습니다.
이러한 위험 때문에 #define 매크로는 매우 조심해서 사용해야 하며, 모든 인자 각각을 괄호로 감싸주는 것은 최소한의 방어 장치라고 할 수 있습니다. 이외에도 매크로 함수의 인자로 함수 호출을 넣는다든가 하는 것도 또다른 위험성을 야기하기도 하므로, 가급적이면 사용하지 않으시기를 권장합니다.
아 그렇군요... 항상 그냥 쓰기만해서 몰랐는데 감사합니다!
댓글을 작성하려면 로그인해야 합니다.
shgusgh9485 1년 전
아래의 2~3번 코드를 보시면 매크로 함수를 이용하여 구현을 했는데 틀린 답이 나왔습니다.
그래서 주석처리 한 것처럼 함수로 따로 구현을 하니 맞았습니다가 떴는데
왜 매크로로 하면 틀린 출력이 나올까요??