2010-02-27 5 views
4
#include <iostream> 
#include <cmath> 

#define max(x,y) (x)>(y)? (x): (y) 

int main() { 
    int i = 10; 
    int j = 5; 
    int k = 0; 
    k = max(i++,++j); 
    std::cout << i << "\t" << j << "\t" << k << std::endl; 
} 
+4

'최대'매크로는 실제로 '최소'매크로입니다. –

+0

@James 매크로가 같은 변수에 두 가지 수정을 일으킬 수있는 방식으로 확장되고 있습니다. 두 변수 사이의 시퀀스 포인트가없는 동일한 변수에 대한 두 가지 수정은 UB라고 생각합니다. 연산자에 대해 확신 할 수있는 시퀀스 포인트에 대해 충분히 알지 못합니까? : 시퀀스 포인트를 도입하거나 도입하지 마십시오. –

+0

@James : 가리키는 주셔서 감사합니다. 그것을 정정했다. – missingfaktor

답변

12

아니요.

이때

상황이 ?: 조작자가 첫 번째 피연산자 (조건)를 평가 한 후에 시퀀스 포인트 즉시 갖는다는 사실에 의해 저장된 후에는 단지 두 식 (두 번째 또는 세 번째 피연산자) 중 하나가 평가 . 귀하의 코드는

과 같습니다.
... 
bool c = i++ > ++j; 
k = c ? i++ : ++j; 
... 

여기에 정의되지 않은 동작이 없습니다.

+0

사실, 시퀀스 포인트가 없으면 결과는 조건과 동시에 평가할 수 있습니다. 우리는 사용되지 않은 결과 (또는 대체물)에 대한 부작용을 보게 될 것입니다. – configurator

4

음, 분명히 많은 문제가 있습니다.

  • 최대 실제로 분을 계산한다
  • 증가 사업자 방금에서 발생합니다 혼동 접미사/접두사 단위를 사용하여 매크로
  • 을 사용하고 있기 때문에 어떤 선택 선택에 두 배로,하지만이없는
  • 문제에 대한 많은지지.

이 코드는 실행할 때마다 동일한 결과를 산출하므로, 정의되지 않았습니다. COUT에서 :

i = 11 
k = 7 
j = 7 

이 나쁜 숙제 문제처럼 들린다. :)

+1

농담하니, 그것은 나에게 좋은 숙제 문제처럼 보입니다. 이것은 무엇을 하는가? 왜? – TheJacobTaylor

+0

글쎄, 그게 내가 웃는 얼굴을 그 위에 올려 놓은 이유이다. 주로 "숙제"라는 태그가 붙지 않았기 때문에 주로. :) – dpb

+0

아니, 숙제 문제가 아니야. 이것은 지역 코딩 콘테스트의 1 라운드에서 질문을 받았고 UB를 답으로 표시했습니다. : ( – missingfaktor