학부생의 무지한 코더임
C++ primer보고 있는데 평가 순서에서
int i = 0;
cout << i << " " << ++i << endl;
와 같은 코드는 i가 먼저 평가되느냐, ++i가 먼저 평가되느냐에 따라 1 1이 될 수도, 0 1이 될 수도 있고
이에 대한 평가 순서는 거의 정해져 있지 않아 미정의이다 라는 내용을 보고 코드를 입력해봤는데
아치리눅스 nvim으로 돌려서 g++로 컴파일과 실행을 몇 번 되풀이 해봤는데 전부 0 1이 나왔음
여기서 좀 궁금해졌는데
평가 순서가 정해져있지 않다는건 규격화된 표준이 없어, 컴파일러마다 다르다 라는거야?
아니면 같은 컴파일러여도 정해진게 거의 없어 컴파일 혹은 실행할 때 마다 다르다 라는거야??
직접 돌렸을 때 전부 0 1이라 전자인가 싶은데 잘못된 이해일까봐 질문해봄
애초에 평가를 컴파일 단계에서 하는게 맞나? 구글링 해봤을 때 컴파일러에 대한 언급이 없는걸 봐서 컴파일러도 관계가 없는건가 싶기도 하고 모르겠다
- dc official App
컴파일러마다 다른건 implementation defined고 이게 너가 말한 본문에서의 예임. 이거는 컴파일러 사이트 가면 어떤 동작이 나오는지에 대한 명세가 있음
아하 고마워 찾아 들어가서 공부해봐야겠다. 큰 도움이 됐음 - dc App
저런 코드도 쓰면 안됨. 아래 말한 ub처럼 "좆되는 코드"는 아니지만 다른 컴파일러로 실행하면 다른 결과가 나올 수 있기 때문임.
당연히 그렇겠다 싶었음 정말 극도로 제한된 환경에서 쓸게 아니라면 꼭 피해야겠네 - dc App
우리는 이런걸 UB라 부르기로 했어요
더 위험한건 undefined behavior인데 이게 바로 "미정의"임. 이건 컴파일러가 말그대로 지꼴리는대로 맘대로 결과를 낼수 있고 언제 실행하느냐에 따라 결과가 달라질수도 있음. 다섯자로 요약하면 좆되는 코드임. 본문 경우는 ub는 아님
저거랑 비슷해 보이는데 ub인 경우는 i = ++i + i++;
컴파일러는 정해진 컴파일 규칙이 있다 없을 수가 없다 없으면 컴파일을 못한다 근데 그게 ub니 뭐니 하는건 다른 컴파일러와 똑같이 동작한다는 아무런 보장도 없고 다르게 평가한다고 잘못된게 아니라는 말임 컴파일러 버젼이 바뀌고 평가가 달라져도 책임 안진다는 소리도 되고