부연하면 연산자의 우선순위 때문에 그렇습니다. 원래의 매크로를 써서 전개하면 maxfp = ((7) > (0)) ? (7) : (0) + 1;
가 됩니다. 의미에 변화를 주지 않는 괄호를 없애고 우선순위를 명확히 나타내면 maxfp = 7 > 0 ? 7 : (0 + 1);
이 되지요. 결과는 당연히 7입니다.
해결책은 위에서 보여주셨군요.
삼항 연산자의 조건식 이후(? 지점)에 sequence point가 존재하므로 조건식의
값은 1이고 이때 a의 값은 5가 됩니다. 조건식이 참이므로 a++을 평가하게 되고
따라서 최종적으로 a의 값은 6, b의 값은 5가 됩니다.
지금같은 상황이 매크로의 단점 중 대표적인 예입니다. 부작용(side effect)이 있는
식을 매크로의 인자로 쓰면 의도하지 않은 결과를 얻게 될 수도 있고, 어떤 때는
코드의 결과 자체가 정의되지 않을 수도 있습니다. 뭐, 지금처럼 헷갈릴 수도 있지요. :-)
Re: max 값을 구하는 매크로가 원하는대로 작동이 안되네요..
매크로에 괄호를 잘못묶어주셨습니다.
#define MAX(A, B) ((A) > (B)) ? (A) : (B)
이걸
#define MAX(A, B) ((A) > (B) ? (A) : (B))
이렇게 해주셔야 겠지요.
A와 B를 비교하는것을 하나로 묶어버린후 조건연산자를 수행하게 되는겁니다.
내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.
부연하면 연산자의 우선순위 때문에 그렇습니다. 원래의 매크로를 써서 전개
부연하면 연산자의 우선순위 때문에 그렇습니다. 원래의 매크로를 써서 전개하면
maxfp = ((7) > (0)) ? (7) : (0) + 1;
가 됩니다. 의미에 변화를 주지 않는 괄호를 없애고 우선순위를 명확히 나타내면
maxfp = 7 > 0 ? 7 : (0 + 1);
이 되지요. 결과는 당연히 7입니다.
해결책은 위에서 보여주셨군요.
superkkt님 요즘 C++ 공부중이신것 아니셨습니까?C++ 에
superkkt님 요즘 C++ 공부중이신것 아니셨습니까?
C++ 에는 std::max 라는 훌륭한 녀석이 있습니다;;
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
[quote="쌀밥"]superkkt님 요즘 C++ 공부중이신것 아니셨습
아니였습니다. 8) C 공부 중입니다..
======================
BLOG : http://superkkt.com
답변은 아니고요..gcc의 옵션중에 전처리문이 적용된 소스를 보는게
답변은 아니고요..
gcc의 옵션중에 전처리문이 적용된 소스를 보는게 있습니다.
그 옵션이 -g 이던가.. 혹시 vc++을 쓰신다해도 그런 옵션을 설정할 수 있는데 /p 던가요.. -_-; 정확히 뭐죠? 아시는분.. -_-;;
[quote="rainmon"]답변은 아니고요..gcc의 옵션중에 전
gcc는 -E, VC++은 /P입니다. (대문자여야 합니다.)
[quote="rainmon"]답변은 아니고요..gcc의 옵션중에 전
전처리 결과를 아시려면 /E 옵션을 넣으시면 됩니다.
---
http://coolengineer.com
gcc의 경우에는 -E 옵션으로 알고 있습니다.그리고 --save-t
gcc의 경우에는 -E 옵션으로 알고 있습니다.
그리고 --save-temps 라는 옵션은 중간에 생성되는 모든 파일을 지우지 않고 그대로 남겨두라는 옵션이기때문에 *.i 확장자의 전처리된 파일을 볼 수가 있습니다.
메크로보다는 함수를 만들어 사용하시는게 좋을듯 합니다.C++ 가
메크로보다는 함수를 만들어 사용하시는게 좋을듯 합니다.
C++ 가 아니라고 하시니 직접 만들어서...;;
예를 들어 메크로인 경우 이런 문제가 생기게 됩니다.
앞서와 비슷한 경우인데...
int a = 4;
int b = MAX( a++, 3);
기대하는 b 는 5가 되겠지만, 실제로는 6이 되지요...
이런 문제는 (메크로가 아니라) 함수로 바꾸면 사라집니다.
이런 이유로 C++ 에서 inline 함수가 추가된것이기도 하지요...
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
[quote="쌀밥"]메크로보다는 함수를 만들어 사용하시는게 좋을듯 합니
저기서 기대하는 b가 4가 되어야 하는거 아닌가요? 아~ 메크로 무쟈게 햇갈리는군요..
======================
BLOG : http://superkkt.com
[quote="superkkt"][quote="쌀밥"]메크로보다는 함수를
헷갈릴 때는 매크로를 전개해서 살펴보면 됩니다. 저 코드를 전개하면
삼항 연산자의 조건식 이후(? 지점)에 sequence point가 존재하므로 조건식의
값은 1이고 이때 a의 값은 5가 됩니다. 조건식이 참이므로 a++을 평가하게 되고
따라서 최종적으로 a의 값은 6, b의 값은 5가 됩니다.
지금같은 상황이 매크로의 단점 중 대표적인 예입니다. 부작용(side effect)이 있는
식을 매크로의 인자로 쓰면 의도하지 않은 결과를 얻게 될 수도 있고, 어떤 때는
코드의 결과 자체가 정의되지 않을 수도 있습니다. 뭐, 지금처럼 헷갈릴 수도 있지요. :-)
그...그러네요; ++a 로 쓴다는 것이 그만..; ㅋㅋ하지만 제
그...그러네요; ++a 로 쓴다는 것이 그만..; ㅋㅋ
하지만 제가 말하는 요점은
메크로는 문제의 소지가 많다는 것인데..... 그점만은 전달하고 싶었습니다.
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
댓글 달기