2012-10-31 2 views
1

내 애플리케이션이 IndexOutOfRanage 예외를 발생 시켰을 때 충격을 받았습니다. Debugger Locals Pane을 열었을 때 내 정수가 경계를 넘었 음을 알았습니까? 기본적으로 내 코드에서 이런 일이 :Visual Studio 2010의 버그/이상한 For-Loop 동작?

string folder = Extender.GetSetting<string>("textFolder"); 
string mlink = folder + "\\" + filename + ".txt"; 
if(File.Exists(mlink)) 
{ 
    string fContent = File.ReadAllText(mlink); 
    rtbLearnGuide.Text = fContent; 
    string[] strings = fContent.Split(' '); 
    for (int i = 0; i < strings.Length; i++, words.Enqueue(strings[i])); 
} 

여기서 문제는 내가 strings[]의 길이에 도달, 난 아래 사진을 첨부했습니다. 더 이상 무엇

Weird For-Loop behaviour

내가이 문제를 두 번째로 재현하는 데 실패한다는 것입니다.

NB : 결과는, 심지어 4 배처럼 다시 실행하려고 후를 그리는 실패 난 다음이었다

var dc = this.CreateGraphics();//and some other stuff 

: 나는 this.CreateGraphics();으로 이전과 비슷한 오늘을 경험 내 코드는 무엇인가 같았다 코드로 돌아가 dc를 명시 적으로 정의하여 작동 중이었습니다. 그런 다음 다시 var로 변경했지만 여전히 작동 중입니다. /?

무엇이 잘못되었을 수도 있습니다.

는 편집 :

난 그냥 순서를 변경하면 작동 것을 발견했다. 예를 들어 :

for (int i = 0; i < strings.Length; words.Enqueue(strings[i]), i++); 

오류가 발생하지 않습니다.

+3

대부분의 개발자가 예상하는 것처럼 for 루프를 작성하지 않으려는 이유가 있습니까? – CodeNaked

+1

''진술을 결합하는 경우 왜 그만 둡니까? 'words.Enqueue (strings [i ++])'''그러나 @ CodeNaked의 질문이 실제로 작용합니다. –

+0

정확히는 아니지만 실제로 이것은 나를위한 발견 일 뿐이며 여러 for 루프 문이 뒤로 실행되었습니다. –

답변

6

귀하의 질문의 첫 부분에 대답하기 위해, 당신은 루프의 테스트 조건에 대한 전과 인큐 을 실행하고 있습니다. 그래서

for (int i = 0; i < strings.Length; i++, words.Enqueue(strings[i])); 

은 다음과 같아야합니다

for (int i = 0; i < strings.Length; i++) words.Enqueue(strings[i]); 

기본적으로 "증가"부분은 항상 "테스트"부분 전에 실행됩니다.

+0

어, 아니. 실제로, 증가하는 것만 제외하고 for 루프에서 여러 명령문을 사용할 수 있습니다. –

+1

@ChibuezeOpata - 네,하지만 제가 말한 것처럼 그들은 테스트 부분 앞에서 * 실행할 것입니다. – CodeNaked

+2

@ChibuezeOpata, 배열의 0 번째 요소를 건너 뛰고 있습니다. – heavyd

5

for 루프를 논리적으로 포맷하면 오류가 발생하지 않습니다.

코드에서
for (int i = 0; i < strings.Length; i++) 
    words.Enqueue(strings[i]); 

은 "i"가 조건 (strings.Length) 그런 다음 "I"경계의 부족에 word.Enqueue를 실행하는 과거 증가합니다. (의사 코드)

루프 :

i = 0 
Loop_Label: 
IF i >= strings.Length THEN GoTo End_Label 
... where the for loop body should go ... 
i = i + 1 
words.Enqueue strings[i] 
GoTo Loop_Label 
End_Label: 
+0

글쎄, 나는 논리적으로 * 당신이 의미하는 것을 정말로 이해하지 못한다. .. 고마워. –

+1

@ChibuezeOpata "논리적으로"말하자면, 그는 'for' 루프를 어떻게 포맷하는지에 대한 아주 잘 정립 된 표준 실행 대부분의 모든 프로그래머들의 마음에 단단히 뿌리 내리고, 그것을 위반하는 것은 매우 비논리적입니다. – Servy