2012-07-11 2 views
-1

나는 2터보 C (시각되지 않음) ++ (후위 접두사 사업자)

#include<iostream.h> 
#include<conio.h> 
void main(){ 
    clrscr(); 
    int a = 10; 
    int c = a-- - --a; 
    cout<<c; 
    getch(); 
} 

으로 출력을 얻을 ...하지만 때 난 그냥

#include<iostream.h> 
#include<conio.h> 
void main(){ 
    clrscr(); 
    int a = 10,c; 
    c = a-- - --a; 
    cout<<c; 
    getch(); 
} 

로 수정합니다. .. 출력이 0이됩니다. 왜? 자바에서 그들 모두는 2로 출력을주었습니다. C++에는 무엇이 문제입니까? :(C++ 문제

+1

C++에는 아무런 문제가 없지만 모든 것이 코드에 잘못되었습니다. 이것을 확인하십시오 : http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points/4176333#4176333 –

+0

주간 UB 질문 .. –

+0

@ 킹즈 인디 언은 매일 매일을 의미합니다. –

답변

3

아무것도 설명하지 않지만 당신이 그것을 사용하는 방법에 뭔가 문제가있다. 표현 a-- - --a은 C++에서 동작을 보증되지

, 아무것도 발생할 수 있습니다.

깨끗한 솔루션을 그런 코드를 작성하지 않는 것입니다. (합법적이라고해도 그렇게하지 않겠습니다.)

+0

...하지만 내 학교 강의 계획서의 일부와 우리가 따라하는 책에는이 접두사와 후위 물건에 대한 부분이 있습니다. 무엇을해야합니까? –

+0

@SouradeepNanda가 시스템에 대항합니다! –

+0

이것은 연산자 자체와 아무런 관련이 없습니다. 표현식 평가의 문제입니다 (즉, 표현식 평가 방법을 모르기 때문에 동일한 표현식에서 둘 이상의 표현식을 사용하지 마십시오). – akappa

1

Luchian의 답을 좀 더 자세히 설명합니다 .C++에서는 표현식 내에서 하위 표현식이 평가되는 순서가 이것은 다음 표현식에서 의미합니다 :

int c = a-- - --a; 

두 가지 똑같이 유효한 평가 명령이 있습니다.

  1. a-- 첫 번째 (반환 10), 다음 --a (8을 반환), 다음 빼기가 (2 반환)을 평가합니다.
  2. 는 빼기는 (0을 반환), --a 첫 번째 (반환 9), 다음 a--을 (9을 반환) 평가합니다.

이것은 컴파일러의 최적화 기능을 개선하기위한 것입니다. 물론 이것은 C++에서 컴파일러가 선택할 순서를 알 수 없기 때문에 평가 순서에 의존하는 표현식을 사용하는 것은 실수라는 것을 의미합니다. 효율성과 오류 회피 사이의 절충은 C++과 Java에서 다릅니다.

+0

우수 답변 : 간결하고 완전하며 포인트입니다. – akappa