이 자체 초기화가 유효합니까?
-
27-09-2020 - |
문제
이전에 생각해 보았지만 대답하기가 쉽지 않다고 생각한 질문이 있습니다.
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
스택에 할당된 지역 변수입니다.데이터 세그먼트와 달리 스택 상태는 정의되지 않은 쓰레기를 포함하는 것이 거의 보장됩니다.
'x' 변수는 .bss에 저장되며 프로그램을 로드할 때 0으로 채워집니다.결과적으로 프로그램이 메모리에 로드될 때 'x' 값은 0입니다.
그런 다음 main이 호출되기 전에 "x = x + 1"이 실행됩니다.
유효한지 아닌지는 모르겠지만 동작이 정의되지 않았습니다.
기본 호출 전에 x는 0으로 초기화되어야 하므로 해당 값은 1이어야 하며, main을 입력하면 1이 반환됩니다.이는 정의된 동작입니다.