> 백엔드 개발 > C++ > 컴파일러가 C/C에서 변수의 자체 초기화를 허용하는 이유는 무엇입니까?

컴파일러가 C/C에서 변수의 자체 초기화를 허용하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-16 06:50:03
원래의
582명이 탐색했습니다.

Why does the compiler allow self-initialization of variables in C/C  ?

Uninitialized Variables in Self-Initialization: Behavior and Standards

In the realm of programming, it is often a point of concern to use uninitialized variables. However, in case of an uninitialized variable being used as its own initializer, a unique scenario arises.

Consider the following code:

int main(void) {
    int i = i;
}
로그인 후 복사

11과 같은 표준을 사용하여 clang/gcc/clang /g로 컴파일할 수 있습니다. 또한 -Wall -Wextra 옵션을 지정해도 컴파일러는 경고를 출력하지 않습니다.

그러나 코드를 int i = i 1; 로 변경하고 -Wall 옵션을 지정하면 다음과 유사한 경고가 표시될 수 있습니다.

why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
    int i = i + 1;
        ~   ^
1 warning generated.
로그인 후 복사

그렇다면 컴파일러가 이 코드를 허용하는 이유는 무엇입니까? 또한 C/C 표준에서는 이에 대해 어떻게 규정되어 있습니까?

컴파일러의 허용

변수 i 는 자기 초기화시에 미초기화이므로, 그 시점에서는 비특정값 을 가집니다. 비특정값이란, 미지정값 또는 트랩 표현의 어느 쪽인가입니다.

구현이 정수형의 채우기 비트를 서포트하고 있어 비특정치가 트랩 표현으로 되어 있는 경우, 그것을 사용하면 미정도의 동작 가 됩니다.

구현에 정수의 채워진 비트가 없는 경우, 값은 단순히 미지정 이 되어, 미정도의 동작는 발생하지 않습니다.

표준 규정

C11 표준 섹션 6.3.2.1p2에는 다음과 같이 자세히 설명되어 있습니다.

lvalue 가 자동 스토리지 기간의 객체를 나타내고, 객체가 register 스토리지 클래스에서 선언될 수 있었던(어드레스가 취득되지 않은) 가능성이 있어, 그 객체가 초기화되어 있지 않은 ( 초기화자로 선언되어 있지 않고, 사용하기 전에 할당이 실행되고 있지 않다) 경우, 그 동작은 미정도리입니다.

따라서, i 의 주소를 취득한 적이 없는 경우는, 미정도리의 동작이 발생합니다. 그렇지 않으면 위의 설명이 적용됩니다.

위 내용은 컴파일러가 C/C에서 변수의 자체 초기화를 허용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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