2017-10-13 2 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 - whileループは、オプティマイザが未定義のコードパスをいくつか削除したため、何もしない無限ループに置き換えられました。

+0

ありがとうございます。それは今意味がある。 –