[C#] C ++ for 루프 전에는 본 적이 없다

C ++ 알고리즘을 C #으로 변환하고있었습니다. 이 for 루프를 발견했습니다.

for (u = b.size(), v = b.back(); u--; v = p[v])
b[u] = v;

C ++에서는 오류가 없지만 C #에서는 수행합니다 (int를 bool로 변환 할 수 없음). 나는 이것이 for 루프를 알아낼 수 없다. 조건은 어디에 있습니까?

누군가 설명해 주시겠습니까?

추신. 확인하기 위해 VECTOR를 LIST에 적용하려면 b.back ()이 b [b.Count-1]에 해당합니까?



답변

for루프 상태 는 두 세미콜론 사이의 중간에 ;있습니다.

C ++에서는 거의 모든 표현식을 조건으로 두는 것이 좋습니다. 0으로 평가되는 것은 의미입니다 false. 0이 아닌 의미 true.

귀하의 경우 조건은 u--: C #으로 변환 할 때 간단히 추가하십시오 != 0.

for (u = b.size(), v = b.back(); u-- != 0; v = p[v])
    b[u] = v; //                     ^^^^ HERE


답변

많은 정확한 답변이 있지만 동등한 while 루프를 작성하는 것이 좋습니다.

for (u = b.size(), v = b.back(); u--; v = p[v])
   b[u] = v;

다음과 같습니다.

u = b.size();
v = b.back();
while(u--) {
   b[u] = v;
   v = p[v];
}

C #으로 변환 할 때 while () 형식으로 리팩토링을 고려할 수 있습니다. 내 생각에 그것은 새 프로그래머에게는 더 명확하고 덜 함정이며 똑같이 효율적입니다.

다른 사람들이 지적했지만 (내 대답을 완성시키기 위해) C #에서 작동하게하려면로 변경 while(u--)해야 while(u-- != 0)합니다.

… 또는 while(u-- >0)u가 음수로 시작하는 경우. (좋아, b.size()절대 부정적인 것은 아니지만 아마도 다른 것이 u를 초기화 한 일반적인 경우를 고려하십시오).

또는 더 명확하게하기 위해 :

u = b.size();
v = b.back();
while(u>0) {
   u--;
   b[u] = v;
   v = p[v];
}

간결한 것보다 명확하게하는 것이 좋습니다.


답변

조건은 for 명령 u--;의 두 번째 위치에 있기 때문에입니다 .

의 값이 u--;0과 다른 true경우이 값 은 (즉, boolean value로 암시 적으로 캐스트 됨) 으로 해석됩니다 true. 대신 값이 0이면로 캐스팅됩니다 false.

이것은 매우 나쁜 코드 입니다.

업데이트 :블로그 게시물 에서 “for”루프 작성에 대해 논의 했습니다 . 권장 사항은 다음 단락에 요약되어 있습니다.

for 루프는 실용적이고 읽기 쉽고 (한 번 익숙해지면) 간결한 구성이지만 잘 사용해야합니다. 흔하지 않은 구문으로 인해 너무 상상적인 방식으로 사용하는 것은 좋은 생각이 아닙니다.

for 루프의 모든 부분은 짧고 읽을 수 있어야합니다. 이해하기 쉽도록 변수 이름을 선택해야합니다.

이 예는 이러한 권장 사항을 분명히 위반합니다.


답변

이것이 루프의 C # 형식입니다.

// back fetches the last element of vector in c++.
for (u = b.size(), v = b.back(); (u--) != 0; v = p[v])
{
  b[u] = v;
}

size () 및 back ()에 해당하는 것을 대체하십시오.

그것이하는 일은 목록을 뒤집고 배열에 저장하는 것입니다. 그러나 C #에서는이를 위해 시스템 정의 함수를 직접 가지고 있습니다. 따라서이 루프도 작성할 필요가 없습니다.

b = b.Reverse().ToArray();


답변

u = b.size(), v = b.back()

초기화입니다.

u--

조건입니다.

v = p[v]

반복입니다


답변

조건은의 결과이며 u--, u감소하기 전의 값입니다 .

C 및 C ++에서은 int 이다 암시 적으로 수행하여 부울로 변환 != 0비교 (0 false, 다른 모든 것들입니다 true).

b.back()인 용기 내의 마지막 요소 인 b[b.size() - 1]경우는 size() != 0.


답변

C true에서 0이 아닌 모든 것은 루프 종료 조건 또는 조건문과 같은 “부울”컨텍스트에 있습니다. C #에서는 명시 적으로 확인해야합니다 u-- != 0.