programing

"for"문에서`! =`또는`<`를 사용해야합니까?

itsource 2021. 1. 18. 07:59
반응형

"for"문에서`! =`또는`<`를 사용해야합니까?


이 두 for 문을 모두 보았습니다.

for(i=0;i<10;i++) 

for(i=0;i!=10;i++)

나는 그들이에 도달하면 모두 멈춘다는 것을 알고 10있지만 두 번째 것을 사용하는 것이 더 나은 것 같습니다 (들었습니다). 반복기를 사용하여 벡터의 멤버에 액세스 할 때 반복기 조건 < vec.end()반복기의 차이점은 무엇인지 알고 싶습니다.!= vec.end()


for(i = start; i != end; ++i)

이것은 "표준"반복자 루프입니다. 포인터와 표준 라이브러리 반복자 모두에서 작동한다는 이점이 있습니다 ( operator<정의 된 반복기에 의존 할 수 없음 ).

for(i = start; i < end; ++i)

이것은 표준 라이브러리 반복자 ( operator<정의 하지 않는 한 )에서는 작동하지 않지만 end어떤 이유로 지나가 더라도 여전히 중지되므로 약간 더 안전하다는 장점이 있습니다. 정수를 반복 할 때 이것을 사용하도록 배웠지 만 실제로 "모범 사례"로 간주되는지는 모르겠습니다.

내가 일반적으로 쓰는 방법은 선호하는 것 <입니다.


둘 다 대부분의 상황에서 작동합니다.

어떤 이유로 루프에서 실행되는 코드 본문 i이보다 큰 것으로 변경 10되면 첫 번째 버전은 루프를 중지하지만 두 번째 버전은 영원히 실행됩니다.


내 일상적인 연습은 <정수와 같은 간단한 유형으로주기를 반복 !=할 때 사용 하고 stl 종류의 반복기로 작업 할 때 사용하는 것입니다.


for ( initialization ; termination condition ; iteration )

그 각각에 대해 들어, 귀하의 요구 사항에 맞게 youself 최고의 하나를 선택 termination condition하면 다음과 같은 이진 조건 연산자의 사용 >, <, >=, <=,!=

주어진 질문에 대해 임의의 경우를 고려하십시오.

for(i=0;i!=10;i++)
{
 .
 .
 i=11; //somewhere if the loop variable is changed to a value greater than 10 (this assumption is solely for demo)
 .
 .
 .
}

이 경우 루프는 무한한 것으로 판명됩니다. 오히려 condition을 사용하면 i<10평소대로 작동합니다. 그래서 내 요점은 첫 번째 접근 방식이 조건을 엄격하게 설정하는 것이 조금 더 안전하다는 것 입니다.


가장 좋은 방법은! =를 반복자 (C ++)와 함께 사용하고 그렇지 않으면 <를 사용하는 것입니다. 절대로 == 또는! =를 float / doubles와 함께 사용하지 마십시오. 다음 루프는 무한 루프입니다.

for (double i = 0.0; i != 1.0; i += 0.1)
    printf("yes, I'm an infinite loop ;)");

! =는 i의 값이 10을 초과하면 테스트가 참을 평가하도록 허용하고, <은 내가 10을 초과하거나 단순히 그와 같을 경우 거짓으로 평가하도록합니다.

i의 값이 루프 본문 내에서 변경 될 수 있다면 고려할 수 있습니다.

그러나 정해진 횟수만큼 무언가를하려는 경우 <가 더 설명 적이지만 둘 다 충분합니다. ! = 간단한 단계 10 개 항목 및 작업 수행 루프의 경우 의도를 명시 적으로 표시하는 측면에서 차선책으로 간주되어야합니다.


나는 그들이 10에 도달하면 모두 멈춘다는 것을 알고 있지만 두 번째 것을 사용하는 것이 더 나은 것 같습니다.

그것은 마이크로 최적화입니다. 더 의미있는 것을 사용하십시오 (위 <가 더 의미가 있습니다).

무엇이 다른가요?

첫 번째 버전은 부등식 연산자를 사용하고 두 번째 버전은 !=less 연산자를 사용합니다 <.


나는 보통 <다른 사람들이 언급 한 이유로 for-loops에서 사용 합니다. while-loops와 더 발전된 for-loops에서는 !=내 프로그램이 무엇을하는지 추론하기가 훨씬 쉽습니다.

와 같은 배열에서 '5'의 첫 번째 실행 후 위치를 찾고 싶다고 가정 해보십시오 [5,5,5,3,5,2,3,2,0]. 그것은 우리가 원하는 것 k입니다 0 <= i < k => a[i] = 5.

int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
    pos = pos+1;

루프가 실행되면 루프 가드의 역이 참임을 알 수 있습니다 : pos == N || a[pos] != 5. 어느 쪽이든 우리는 pos우리가 원하는 것을 가지고 있습니다 .

지금 우리가 사용했던 말을 <모든 우리가 나중에 알았 것, 루프 가드에 pos >= N || a[pos] != 5,하지만 그건 우리가되고 싶어 상황이 아니다. 더 많은 일을하고, 우리가 증명할 수 있음을 우리는에서 가능하지 않을 수 pos > N있지만, !=루프 가드에서 사용하는 것과 비교하여 시간 낭비와 같은 솔기 .

참조 URL : https://stackoverflow.com/questions/8178463/in-a-for-statement-should-i-use-or

반응형