2013-02-02 1 views
-3

은 다음 코드 조각을 고려? 흥미로운 부분은 초기화되지 않은 변수가 다른 반복에서 다른 값을 가질 수있는 경우입니다.루프의 초기화되지 않은 로컬 변수는 반복 할 때마다 동일한 값을 갖습니까? <pre><code>int l; int k; for (int i=0; i < 2; ++i) { int j; if (i == 0) l = j; if (i == 1) k = j; } assert (l == k); </code></pre> <p></p>는 주장이 보유하고 있는가 :

LLVM을 가지고 놀아 보니 어설 션은 실제로 유지됩니다 : 이 표준에 의해 실제로 보장 되는가? 아니면 정의되지 않았고 LLVM 컴파일러가 구현하는 방식으로 발생 하는가?

+1

정의되지 않은 동작을 정의해야하므로 커뮤니티를 트롤하지 마십시오. 감사합니다. –

+1

컴파일러 오류, 정의되지 않은 j 및 어설 션 (j == k) – qPCR4vir

+0

@ H2CO3 : 정의되지 않은 동작은 없습니다. – ipc

답변

3

을 시도하면 : j의 값은 불확실합니다. 선언 된 스택에 어떤 일이 일어나 든간에 어설 션은 이 반드시 일 필요는 없습니다.


편집이 :이 j 이후는 스택에 같은 장소에 할당 것마다 가능성이 있음을 지적하고, 값의 예상 행동은 무엇인가?

사실 동일하다는 사실은 구현의 사실에 불과합니다. 표준 상태 :

가변 길이 배열 유형이없는 등의 객체에 대한

6.2.4, 수명이 그 블록의 실행이 만료 될 때까지 연관된 를 갖는 블록 진입로부터 연장 어쨌든. (닫힌 블록을 입력하거나 함수를 호출하면 일시 중단되지만 은 끝나지 않습니다. 현재 블록이 실행됩니다.) 블록에 이 반복적으로 입력되면 매번 개체의 새 인스턴스가 만들어집니다. 개체의 초기 값은 불확정합니다. 객체에 대해 초기화가 으로 지정되면 블록 실행시 선언이 에 도달 할 때마다 수행됩니다. 그렇지 않으면 선언에 도달 할 때마다 값이 이됩니다.

불확실합니다.

편집 2 : 그게 C 표준이었습니다. C++에서 : 자동 저장 기간 (3.7.2)와

6.7 변수들이 선언 문이 실행될 때마다 시간이 초기화됩니다. 블록에 선언 된 자동 저장 기간의 변수는 블록 (6.6)의 출구 에서 삭제됩니다.

+0

실제로 "선언 될 때 스택에있는 모든 일이 발생합니다", 반복간에 값이 변경되는 이유는 무엇입니까? –

+0

고마워요, 데이비드, 이건 제가 실제로 요구하는 것입니다. LLVM은 j를 스택에 넣고 입력 블록에 넣습니다. 따라서 IR이 주어지면 변경되지 않습니다. 이것이 보장되는지 궁금합니다. –

+0

아니요, 묻지 않으시겠습니까? 당신은 표준이 제공하는 것을 무엇을 요구하고 있습니다. 이 대답은'j'가 스택에 저장되어 있다고 가정합니다. 표준은 그것에 대해 아무 말도하지 않습니다. –

관련 문제