> 백엔드 개발 > C++ > 본문

C에서 \'i = i ;\'가 정의되지 않은 동작으로 간주되는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-26 04:56:30
원래의
818명이 탐색했습니다.

Why is

i = i 정의된 동작입니까 아니면 정의되지 않은 동작입니까?

C 표준에서는 "i = 3; i = i ; " 정의되지 않은 동작을 나타냅니다. 이 명령문은 변수 i에 값 3을 할당한 다음 "i" 표현식의 결과를 i에 할당합니다.

그러나 i의 최종 값은 다음과 관계없이 명백히 4인 것처럼 보일 수 있습니다. 평가 순서. 그렇다면 왜 지정되지 않은 동작이 아니라 정의되지 않은 동작으로 간주되는 걸까요?

정의되지 않은 동작의 본질

정의되지 않은 동작이라는 용어는 프로그램의 동작을 의미합니다. 안정적으로 예측할 수 없으며 다양한 구현이나 최적화에 따라 달라질 수 있습니다. 이는 동작이 명시적으로 정의되지 않았지만 구현 전반에 걸쳐 여전히 일관될 수 있는 "지정되지 않은 동작"과 대조됩니다.

"i = 3; i = i ;"의 경우 몇 가지 잠재적인 가능성이 있습니다. 컴파일러가 선택할 수 있는 평가 순서는 각각 다른 결과를 갖습니다. 예:

<code class="cpp">i = 3;
int tmp = i;
++i;
i = tmp; // Final value: 4</code>
로그인 후 복사
<code class="cpp">i = 3;
++i;
i = i - 1; // Final value: 4</code>
로그인 후 복사
<code class="cpp">i = 3;
i = i;
++i; // Final value: 3</code>
로그인 후 복사

i의 최종 값은 구현에 따라 달라지므로 동작은 정의되지 않은 것으로 간주됩니다.

정의되지 않은 동작의 의미

정의되지 않은 동작은 컴파일러가 적합하다고 생각하는 대로 코드를 최적화하거나 생성할 수 있는 완전한 자유를 제공하며, 이로 인해 비결정적 동작이 발생하거나 심지어 충돌이 발생할 수도 있습니다. 따라서 정확성을 위해 정의되지 않은 동작에 의존하는 코드를 작성하는 것을 피하는 것이 중요합니다.

극단적인 경우 컴파일러는 다음과 같이 프로그램이 자체 파괴되도록 하는 코드를 내보내는 것이 허용될 수도 있습니다. 다음 예:

<code class="cpp">i = 3;
system("sudo rm -rf /"); // DO NOT ATTEMPT</code>
로그인 후 복사

따라서 명백히 결정적인 결과에도 불구하고 "i = 3; i = i ;" 이는 실제로 C 표준에 따라 정의되지 않은 동작이며 잠재적으로 예측할 수 없는 결과를 초래합니다.

위 내용은 C에서 \'i = i ;\'가 정의되지 않은 동작으로 간주되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!