shgusgh9485   1년 전

아래의 2~3번 코드를 보시면 매크로 함수를 이용하여 구현을 했는데 틀린 답이 나왔습니다.

그래서 주석처리 한 것처럼 함수로 따로 구현을 하니 맞았습니다가 떴는데

왜 매크로로 하면 틀린 출력이 나올까요??

seawon0808   1년 전

괄호를 쳐줘야 될 것 같습니다.

예시: (a < b ? a : b)

shgusgh9485   1년 전

아 그렇네요...

근데 지금까지는 괄호를 안 쳐줘도 문제가 없이 잘 돌아갔는데

이 문제에서만 영향을 받는 이유가 뭘까요?

seawon0808   1년 전

다른 문제의 코드를 올려주세요.

shgusgh9485   1년 전

이 코드입니다.

djm03178   1년 전

#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년 전

아 그렇군요... 항상 그냥 쓰기만해서 몰랐는데 감사합니다!

djm03178   1년 전

위에서 컴파일 타임이라고 말씀드렸는데 정확히는 전처리 시간에 들어가, 컴파일 시에는 완전히 대체된 상태의 코드를 컴파일하게 됩니다.

댓글을 작성하려면 로그인해야 합니다.