appa   2년 전

이번 대회 도중에 D번이...

제 컴퓨터에선 잘 돌아가던 프로그램이 자꾸 제출해도 틀렸다길래.. 대회가 끝나고 '코딩'란에서 예제를 넣어도 안 나오더라구요?

원인을 찾아 여기저기 print를 해보면서 원인을 찾아봤더니....

string s = "A";

map <string, long long> d;

d[""] = 0;

d[s] = d.size();

했더니 제 컴퓨터에서는 d[s]에 1이 들어가고, '코딩'란에서 했더니 2가 들어가더라구요...

이거 왜 이런거죠ㅠㅠㅠㅠ

appa   2년 전

참고로 저는 visual studio 2013을 쓰고 있습니다.

appa   2년 전

다음부터는 .size()는 될 수 있으면 안 쓰고, 그냥 카운트해줘야겠어요ㅠㅠ

wookayin   2년 전

`d[s] = d.size()` 는 모호한 문장이라 해석되는 순서에 따라 정의되지 않은 동작을 수행할 수 있습니다.

하나의 expression 에서 순서에 의존적인 get, set 을 여러개 하는 경우 문제가 될 수 있어요~

1. d[s] 가 먼저 evaluate 되는 경우 : s가 insert 되고 (size = 2), 레퍼런스가 얻어진 뒤 이곳에 d.size() = 2 가 대입됨.

2. d.size() 가 먼저 evaluate 되는 경우 : RHS가 1로 계산되고, s가 insert된 이후에 이 값(1)이 대입됨.

참고: http://stackoverflow.com/questions/8295205/c-function-evaluation-order-in-assignment-operator

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