sys0927   4년 전

이 코드들이 어떤 차이가 있는지 모르겠습니다.

1. auto&로 받은 후 pop()한 다음 값 할당 채점번호 18448469

auto& tmp = q.front();
q.pop();
int cur = tmp.idx;
int sum = tmp.sum;
int maxe = tmp.maxe;

2. auto&로 받은 후 값 할당 후 pop() 채점번호 18448485

auto& tmp = q.front();
int cur = tmp.idx;
int sum = tmp.sum;
int maxe = tmp.maxe;
q.pop();

3. auto&로 받은 후 pop()한 다음 값 할당 (struct Node에 있는 변수 sum의 타입을 int에서 ll으로 바꿈) 채점번호 18448428

auto& tmp = q.front();
q.pop();
int cur = tmp.idx;
ll sum = tmp.sum;
int maxe = tmp.maxe

이 문제에서 오버플로우는 없기 때문에 3가지 경우 모두 같은 결과가 나와야 한다고 생각하는데 결론적으로 2, 3번은 정답인데 1번이 오답입니다. 아래에는 틀리는 1번 코드를 첨부하겠습니다.

auto& tmp를 하면 q.front()에 있는 값을 reference로 담아두는데 q.pop()을 해버리면 해당 주소의 값이 변하지 않는다는 보장이 없으므로 오답 혹은 런타임에러가 발생할 수 있습니다.

3이 운좋게 정답이 나온거고 1, 3은 모두 잘못된 코드입니다. 참조자를 이용하지 말고 그냥 auto tmp로 받는 것이 좋아보입니다.

sys0927   4년 전

운이 좋았던거군요 감사합니다

댓글을 작성하려면 로그인해야 합니다.