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 중국어 웹사이트의 기타 관련 기사를 참조하세요!