2017-10-13 3 views
1
#include <stdio.h> 
      int main() { 
       int i = -1; 
       int sum = 1000; 
       printf("\nThe value of sum to start is: %d", sum); 
       while (i <= 0) { 
        i = i - 1; 
        sum = sum + 1; } 
       if (sum == 0) 
        printf("\nSum is zero"); 
       if (sum < 0) 
        printf("\nSum is less than zero"); 
       if (sum > 0) 
        printf("\nSum is greater than zero"); 
       printf("\n"); 
      } 

왜 합계 결과가 0보다 작을 지 설명 할 수 있습니까? 및 while 루프는 어떻게 끝나나요?2의 보수 연산

답변

3

이 프로그램의 원인은 undefined behaviour입니다. 잠시 후 sumint의 가능한 최대 값에 도달합니다. 그런 다음 sum + 1은 산술 연산에서 오버플로로 인해 정의되지 않은 동작을 발생시킵니다.

i은 (우리가 sum 문제를 수정 한 경우, 처음으로 오버 플로우 될 것입니다) 비슷한 문제가 있습니다.

정의되지 않은 동작은 아무 일도 발생할 수 없음을 의미합니다. 옵티마이 저는 실제 코드와 무관하게 보이는 코드를 내뱉거나 컴파일러가 코드 컴파일을 거부 할 수도 있습니다 (UB가 모든 코드 경로에서 발생하기 때문에).

Example compilation by gcc - 옵티마이 저가 정의되지 않은 코드 경로를 제거했기 때문에 루프는 무의미한 루프로 대체됩니다.

+0

고맙습니다. 그것은 지금 의미가 있습니다. –