2009-09-29 4 views
0

for 루프 내에 할당해야하는 몇 가지 변수가 있습니다. 분명히 루프가 종료 될 때 C#은 그곳에서 일어난 일을 무시하고 변수는 원래 상태로 돌아갑니다. 구체적으로 말하면 목록의 마지막 요소와 마지막 요소가 필요합니다. 코드는 다음과 같습니다.C#의 로컬 변수 문제

int temp1, temp2; 
for (int i = 0; i < toReturn.Count; i++) { 
    if (i == toReturn.Count - 2) { // Next-to-last element 
     temp1 = toReturn[i]; 
    } else if (i == toReturn.Count - 1) { // Last element 
     temp2 = toReturn[i]; 
    } 
} 
// At this point, temp1 and temp2 are treated as uninitialized 

참고 : 잘못된 변수 이름은 절대로 임시 변수입니다. 더 복잡한 것은 모든 것을 혼란스럽게합니다.

자,이 문제를 해결하기위한 두 가지 방법이 있습니다 : 하나는 루프가 종료 된 후에 변수를 살리는 방법을 찾고, 다른 하나는 할 수있는 Python과 같은 것을 수행하는 것입니다. temp = my_list[-1] 리스트의 마지막 요소를 얻는다. C#에서는 이러한 것들이 가능합니까?

편집 : 컴파일하려고하면 "할당되지 않은 로컬 변수 'temp1'사용 오류가 발생합니다. 이 코드는 실행되지 않으며, 결코 호출되지 않는 메소드 안에 있습니다. 이 방법이 도움이된다면 다른 루프에서 변수를 사용하려고합니다.

+1

컴파일러에서 temp1 및 t emp2가 초기화되지 않았습니까? 또는 그들은 설정되어야하지만 결코 존재하지 않는다 (관찰 가능한 가치는 초기화되지 않는다)? – Michael

+1

C#에서는 변수가 루프 후에 원래 상태로 돌아 가지 않습니다. 변수가 루프 내에서 작성되지 않은 한 루프 내에서 설정된 값을 유지합니다. –

답변

11

왜 그냥 할 ...

int temp1 = 0; 
int temp2 = 0; 
    if (toReturn.Count > 1) 
     temp1 = toReturn[toReturn.Count - 2]; 
    if (toReturn.Count > 0) 
     temp2 = toReturn[toReturn.Count - 1]; 
+0

와우, 나는 그런 생각을 한 적이 없어. 고맙습니다. – Javier

+0

+1 생각 : –

5

toReturn.Count가 0이면 루프가 실행되지 않고 temp1과 temp2가 초기화되지 않습니다.

+0

그건 일어나지 않을거야. – Javier

+0

컴파일러 오류 또는 경고가 표시됩니까? 아니면 관측 된 값이 설정되지 않았다는 것을 말하고 있습니까? 컴파일러 경고의 경우 컴파일러는 toReturn.Count가 항상 0보다 큼을 알 수 없습니다. – Michael

+4

컴파일러에 관한 한 중요하지 않습니다. 왜냐하면 결코 발생하지 않는다고 합리적으로 증명할 수 없기 때문입니다. 그래서 _potentially_ 초기화되지 않은 변수에 대해 불평하는 이유입니다. 선언 할 때 초기화 (예 : 0 지정)하면 컴파일되고 작동합니다. –

1

이 무엇을 할거야?

if (toReturn.Count > 1) { 
    temp1 = toReturn[toReturn.Count - 2] 
    temp2 = toReturn[toReturn.Count - 1] 
} 
0

시도가 TEMP1 및 TEMP2 초기 값 즉, 0 또는 무엇이든 그들이 초기화되지 않을 수도 있기 때문에 적절한를 제공

+0

확장하려면 : * 당신 * 알고 temp1과 temp2가 설정됩니다. 귀하의 코드는 그 이상을 보장합니다. 그러나 할당 문은 if 문 안에서 발생하기 때문에 * 컴파일러 *는 temp1/temp2가 설정된다는 것을 알지 못합니다. 관련해서는 If 문이 결코 사실이 아니며 할당이 결코 발생하지 않을 수도 있습니다. – abelenky

0
int temp1 = 0; // Or some other value. Perhaps -1 is appropriate. 
int temp2 = 0; 

for (int i = 0; i < toReturn.Count; i++) { 
    if (i == toReturn.Count - 2) { // Next-to-last element 
     temp1 = toReturn[i]; 
    } else if (i == toReturn.Count - 1) { // Last element 
     temp2 = toReturn[i]; 
    } 
} 

컴파일러는 temp1temp2 확실히하기 전에을 할당 것을 요구한다 그들의 가치를 읽으십시오. 컴파일러는 for-loop가 변수를 할당한다는 것을 모릅니다. for 루프가 전혀 실행되지 않는지는 알 수 없습니다. 또한 if-condition이 true이 될지 여부도 알지 못합니다.

위의 코드는 temp1temp2이 무언가에 지정되었는지 확인합니다. temp1temp2 루프할당 된 여부를 확인하려면이 추적하는 데 고려 :

int temp1 = 0; 
int temp2 = 0; 
bool temp1Assigned = false; 
bool temp2Assigned = false; 

for (int i = 0; i < toReturn.Count; i++) { 
    if (i == toReturn.Count - 2) { // Next-to-last element 
     temp1 = toReturn[i]; 
     temp1Assigned = true; 
    } else if (i == toReturn.Count - 1) { // Last element 
     temp2 = toReturn[i]; 
     temp2Assigned = true; 
    } 
} 
+1

이 경우 Joren에서는 '할당 된'bool 대신 nullable int를 사용하는 것이 좋습니다. –

+0

맞아요, 그게 더 좋은 선택입니다. nullables를 거의 사용하지 않습니다. :) – Joren

0

당신이 기본값하려면 다음

int count = toReturn.Count; 
int temp1 = count > 1 ? toReturn[count - 2] : 0; 
int temp2 = count > 0 ? toReturn[count - 1] : 0; 

당신이 돈 경우를 ' 기본값을 신경 쓰지 않고 이전에 카운트가 있는지 확인하십시오 :

int count = toReturn.Count; 
int temp1 = toReturn[count - 2]; 
int temp2 = toReturn[count - 1];