해결된 질문
작성
·
425
0
안녕하세요 선생님^^
단항 증감연산에 대한 접근 강의를 보고 인터넷에서 좀더 찾아봤는데, 아래와 같은 코드가 있더라구요
int a = 3;
int b = a-- + 3 + --a;
cout << "a는 " << a << ", b는 " << b << '\n';
일단 제 환경에서는 출력이 "a는 1, b는 7"로 나오는데,
위 코드는 시퀀스 포인트의 규칙을 위배하여 undefined behavior라고 하던데 사실인가요?
컴파일러들이 모든 ub를 예방해주는건 현실적으로 어려운 일인가요?
가끔보면 c/c++에서만 발생하지 않는 에러가 있더라구요... 예를 들어 index out of range같은 런타임 에러는 자바나 c#에선 볼 수 있지만 c/c++에선 볼 수가 없고 사실상 ub로 여겨지던데 왜 c/c++의 컴파일러들은 이러한 부분을 확인해주지 않는건가요?
항상 감사드립니다~~^^
답변 1
1
네, 맞습니다. Sequence point(C++11부터는 Sequencing) 규칙에 위배 됩니다. 이 시퀀싱 포인트는 일정 단위(보통 표현식)로 연산을 나눈 것이며 각 시퀀스 포인트에서 다음 시퀀스 포인트로 넘어가기 전 모든 연산이 완료되어야 합니다. 그런데 b = a-- + 3 + --a 같은 식에서 a는 한 시퀀스 포인트 내부에서 두 번 값이 달라집니다. 전형적인 Undefined behavior 입니다. 같은 예로 a = a++;나 arr[i] = i++; 같은 식이 있습니다. 문법은 맞지만 규칙 위반입니다. 아울러 좋지 못한 코드라 하겠습니다.
아니오. 가능합니다. 컴파일러가 이를 인지하지 못할 가능성은 없습니다. 따라서 경고는 물론 차단도 가능합니다.
Pointer와 높은 자유도 때문입니다. 이는 언어의 문법 차원에서 허용할 것인지 아닌지 선택하는 문제입니다. C#이나 JAVA같은 Managed code 언어들은 이런 부분을 강력하게 차단함으로써 예상되는 논리적 오류를 사전에 다수 차단해줍니다. 그러나 C/C++는 이를 허용합니다. 나아가 Pointer라는 절대반지 같은 권력을 개발자에게 허락합니다. 그래야 JVM이나 운영체제 같은 시스템 제어 소프트웨어도 개발하고 각종 보안 기술도 구현 할 수 있기 때문입니다. 역으로 해킹도 가능하겠습니다. 이러한 특수성 때문에 최근에는 C언어를 거의 기계어처럼 판단하는 의견도 생겼습니다.
감사합니다. ^^
ub는 어찌보면 자유도에 따른 대가라고도 할 수 있는거군요^^ 좋은 답변 감사드립니다