2012-03-24 4 views
0

왜 결과가 36이 될지 이해하지 못합니다. 누군가 여기서 내게 무슨 일이 일어나고 있고 전처리 기가하는 일을 설명 할 수 있습니까? 많이C++ 매크로 sideeffect

#include <iostream> 
#define QUADRAT(x) ((x) * (x)) 

using namespace std; 

int main() 
{ 
    double no = 4.0; 
    double result = QUADRAT(++no); 

    cout << result; 
    return 0; 
} 

감사합니다 :>

답변

4

이 예에서 전 처리기는 QUADRAT(++no)((++no) * (++no))으로 바꿉니다.

두 증분 사이에 시퀀스 포인트가 없다는 사실이 없다면 no이 두 번 증가하므로 실제로 정의되지 않은 동작이 발생합니다. 아무도 무슨 일이 일어날지를 알 수 없기 때문에 당신이 보는 어떤 출력이라도 유효합니다. 어떻게됩니까

+1

감사합니다. 올리, 이제 이해가됩니다. :) – Max

2

전처리는 기본적으로 복사 및 붙여 넣기 엔진입니다. 매크로는 이 아니고, 함수는 아닙니다. 대신 인라인으로 확장됩니다. 매크로가 확장 될 때 코드에 어떤 일이 발생하는지 고려하십시오.

+2

세스, 나는 그가 틀린 대답에 대해 논평했다고 생각합니다. –

+0

나는 당신의 대답 세스를 의미하지만, 이상하게 Stackoverflow 실수로 그것을 게시 올리라고 나에게 말했다. 이제 너의 이름이 그 아래에있다. :/ – Max

0

이 X 대신에 어떤 ++의 리터럴 대체의 일종이다, 당신이 작성한 같다 : 결과는 ...이 동작을 정의되지해야한다 무엇

double result = ((++no) * (++no)); 

은 (당신이 얻을 수 36 우연히), 그리고 g ++와 - 벽은 나와 동의한다.

1

이 줄 :

double result = QUADRAT(++no); 

이 확장됩니다 :

double result = ((++no) * (++no)); 

이 실행 끝나는하는 방식은 동일합니다 :

no = no + 1; 
no = no + 1; 
result = no * no; 

그것은 때문에이 방법을 실행 증분은 곱하기 전에 수행됩니다. 선행 처리기는 전달한 텍스트 사본을 처리하므로, "++ no"그래서 최종 코드에서 두 번 나타나고 결과가 계산되기 전에 각 ++의 증가가 일어나지 않습니다. 이 문제를 해결하는 방법은 인라인 함수 사용하는 것입니다

inline double QUADRAT(double x) { return x * x; } 

대부분의 현대적인 컴파일러는 텍스트 대체를하지 않고이 코드를 확장됩니다 - 그들은 그러나 위험없이, 당신에게 빨리 전 처리기 정의로 뭔가를 줄 것이다 당신이 직면하고있는 것과 같은 문제가 있다는 것.