이 자체 초기화가 유효합니까?
아까 생각했던이 질문이 있는데 대답하는 것이 사소하지 않다고 생각했습니다.
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
'Programing' 카테고리의 다른 글
자바 스크립트의 배열 리터럴 표기법은 무엇이며 언제 사용해야합니까? (0) | 2020.11.21 |
---|---|
Visual Studio에서 "Clean"명령은 무엇을합니까? (0) | 2020.11.21 |
프로세스의 CPU 및 메모리 사용량을 얻기위한 올바른 성능 카운터는 무엇입니까? (0) | 2020.11.21 |
복사본을 생성하지 않고 Python에서 목록 분할 (0) | 2020.11.21 |
부정적인 미리보기 정규식 (0) | 2020.11.21 |