루프에 사용되는 조건부 유형은 컴파일러가 더 좋거나 나쁘게 수행 할 수있는 최적화 종류를 제한 할 수 있습니다. 예를 들면 다음과 같습니다.
uint16_t n = ...;
for (uint16_t i=1; i<=n; i++)
... [loop doesn't modify i]
컴파일러는 n이 65535가 아니고 n이 n을 초과하는 것 이외의 방식으로 루프가 종료 되지 않는 한 , 위의 조건으로 인해 n 번째 패스 루프 이후에 루프가 종료되어야한다고 가정 할 수 있습니다 . 이러한 조건이 적용되면 컴파일러는 위 조건 이외의 조건으로 인해 종료 될 때까지 루프가 실행되도록하는 코드를 생성해야합니다.
루프가 대신 다음과 같이 작성된 경우 :
uint16_t n = ...;
for (uint16_t ctr=0; ctr<n; ctr++)
{
uint16_t i = ctr+1;
... [loop doesn't modify ctr]
}
그러면 컴파일러는 루프가 n 번 이상 실행될 필요가 없으므로보다 효율적인 코드를 생성 할 수 있다고 안전하게 가정 할 수 있습니다.
부호있는 유형의 오버플로는 불쾌한 결과를 초래할 수 있습니다. 주어진:
int total=0;
int start,lim,mult; // Initialize values somehow...
for (int i=start; i<=lim; i++)
total+=i*mult;
컴파일러는 다음과 같이 다시 작성할 수 있습니다.
int total=0;
int start,lim,mult; // Initialize values somehow...
int loop_top = lim*mult;
for (int i=start; i<=loop_top; i+=mult)
total+=i;
계산에서 오버플로가 발생하지 않으면 이러한 루프는 원래와 동일하게 작동하지만 정수 오버플로가 일반적으로 일관된 줄 바꿈 의미를 갖는 하드웨어 플랫폼에서도 영원히 실행될 수 있습니다.