C++ 지식을 향상 시키려고했지만 이전 프로그래밍 콘테스트에서이 문제를 발견했습니다. 올해 대회에 참가하려고 노력할 준비가되어 있습니다.C++ 프로그램의 출력
다음 프로그램의 출력은 무엇입니까?
#include <iostream>
using namespace std;
int dat=1;
int counter=0;
class ClassB;
class B {
public:
virtual void f(int d=5)=0;
};
class A {
unsigned i;
public:
int pod;
int index;
A& operator++() { cout<<"A "<<pod--<<dat++<<endl; A* b=new A; return *b; }
A operator++(int) {cout<<"B "<<pod++<<dat--<<endl; A* b=new A; return *b;}
A& operator--() {cout<<"C "<<dat++ <<++pod<<endl; A* b=new A; return *b;}
A operator--(int) {cout<<"D "<<dat--<<--pod<<endl; A* b=new A; return *b;}
void operator+(A& b) {cout<<"Addition Index "<<index<<endl; pod++;}
friend void B::f(int);
A() : i(0), pod(dat) {pod++; index=++counter; cout<<"CA "<<"Index "<<index<<endl; }
~A(){pod++; cout<<"DA Index "<<index<<endl;}
};
const ClassB& returnClassA(const ClassB& p) {return p;}
class ClassB: public A, public B {
public:
void f(int d=2){A c; c++; pod*=d--;}
ClassB(){cout<<"CB Index "<<index<<endl;}
~ClassB(){cout<<"DB Index "<<index<<endl;}
};
ClassB returnClassB(ClassB s) {return s;}
class ClassC : public ClassB {
public:
ClassC(){cout<<"CC Index "<<index<<endl;}
~ClassC(){cout<<"DC Index "<<index<<endl;}
};
ClassB returnClassC(ClassB s){return s;}
int main()
{
ClassC x;
A v,w;
B *c = new ClassB;
--++v--+++w;
returnClassC(returnClassB(returnClassA(x)));
return 0;
}
이것은 종이에 풀릴 것으로 생각되지만 초보자이기 때문에 컴파일러를 사용했습니다. 또한 변수 카운터와 인덱스가 추가되었으므로 생성되는 개체를 추적 할 수 있습니다. 원래의 표현은 - ++ v - +++ w--; 그러나 나는 그것을 - ++ v - +++ w로 바꿨다. 왜냐하면 컴파일러가 저에게 오류를주기 때문입니다.
부분 :
ClassC x;
A v,w;
B *c = new ClassB;
출력 :
- CA 색인 1
- CB 지수 1
- CC 지수 1
- CA 색인 2
- CA 색인 3
- CA 지수 4
- CB 지수 이해 4
.
다음 표현식을 이해하는 데 문제가 있습니다. - ++ v - +++ w; 그래서 처음에는 - ++ v - ++의 출력을 이해하려고 노력했습니다. 그리고 나서 + w를 추가합니다.
- ++ v - ++; 이다
- D 11
- CA 색인 5
- B 10
- CA 색인 6
- 0 -1
- CA 색인 7
- C 02
- CA 색인 8
- DA 색인 6
- DA 색인 5
즉, 작업 순서는 - (++ ((-) ++))입니다. 왜 이렇게됩니까? 어떤 연산이 먼저 평가되는지에 대한 규칙이 있습니까? 또한 인덱스 6과 5가있는 개체의 소멸자가 호출되는 이유를 모르겠습니까?
원본 표현식을 사용하는 경우 - ++ v - +++ w; , 출력은 :
- D 11
- CA 색인 5
- B 10
- CA 색인 6
- 0 -1
- CA 색인 7
- C 02
- CA 색인 8
- 추가 색인 8
- DA 지수 6 + w 작업이 마지막으로 평가되는 이유는
- DA 지수 5
? 운영자 우선 순위 때문입니까? 또한, 만약 내가 wout < < v.index를 작성하면 2를 반환한다는 것을 알았습니다. v는 여전히 이전에 생성 된 원래의 객체라는 것을 의미합니다. 그렇다면 인덱스 5-8이있는 객체는 어디로 이동합니까? 어떻게 액세스 할 수 있습니까?
마지막 부분 인 returnClassC (returnClassB (returnClassA (x)))); 출력 :
- DB의 인덱스 1
- DA 지수 1
- DB의 인덱스 1
- DA 지수 1
- DB의 인덱스 1
- DA 지수 1
I 돈 소멸자가 왜 불려지는지 이해하지 못합니까?당신이 C에서 연산자를 오버로드 할 때 을주의해야 할
나는 바보 같은 코드를 깨뜨리는 것이 C++ 지식을 향상시키는 가장 좋은 방법이라고 생각하지 않는다. – yngccc
****에 시간을 낭비하지 마라. –
@Nikola - 코드가하는 일을 말하는 것이 어렵다면 유용하지 않습니다. 너는 결코 이와 같은 것을 쓰지 않을 것이다. 목표는 아무도 이해할 수없는 코드가 아니라 분명히 * 올바르게 작동하는 코드를 작성하는 것입니다. :-) –