문제

이전에 생각해 보았지만 대답하기가 쉽지 않다고 생각한 질문이 있습니다.

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이 반환됩니다.이는 정의된 동작입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top