Programing

이 자체 초기화가 유효합니까?

lottogame 2020. 11. 21. 08:19
반응형

이 자체 초기화가 유효합니까?


아까 생각했던이 질문이 있는데 대답하는 것이 사소하지 않다고 생각했습니다.

int x = x + 1;
int main() {
  return x;
}

내 질문은 프로그램의 동작이 정의되었는지 여부가 전혀 유효하지 않은지 여부입니다. 이 정의되어있는 경우,의 값 x에 알려진 main?


나는 그것이 정의되어 있고 x의 값이 1이어야한다고 확신합니다. §3.6.2 / 1은 다음과 같이 말합니다. "정적 저장 기간 (3.7.1)을 가진 객체는 다른 초기화가 일어나기 전에 0으로 초기화 (8.5)되어야합니다. "

그 후에는 모든 것이 매우 간단하다고 생각합니다.


내 질문은 프로그램의 동작이 정의되었는지 여부가 전혀 유효하지 않은지 여부입니다. 정의 된 경우 x의 값이 main에 알려져 있습니까?

이 코드는 확실히 깨끗하지는 않지만 나에게는 예상대로 작동합니다.

int x프로그램 시작시 0으로 정의 된 데이터 세그먼트에 변수를 넣습니다. 이전 main()에는 정적 이니셜 라이저가 호출되었습니다. 들어 x그 코드입니다 x = x + 1. x = 0 + 1 = 1. 따라서 main ()은 1을 반환합니다.

x스택에 할당 된 지역 변수 인 경우 코드는 예측할 수없는 방식으로 작동 합니다. 데이터 세그먼트와 달리 스택 상태는 정의되지 않은 가비지를 포함하는 것이 거의 보장됩니다.


.bss에 저장된 'x'변수는 프로그램을로드 할 때 0으로 채워집니다. 따라서 프로그램이 메모리에로드 될 때 'x'의 값은 0입니다.

그러면 main이 호출되기 전에 "x = x + 1"이 실행됩니다.

그것이 유효한지 아닌지는 모르겠지만 행동은 정의되지 않았습니다.


기본 호출 x를 0으로 초기화해야하므로 값은 1이어야합니다. main을 입력하면 1이 반환됩니다. 이는 정의 된 동작입니다.

참고 URL : https://stackoverflow.com/questions/3309042/is-this-self-initialization-valid

반응형