0

だから、私はこのコードを試していました。出力も警告メッセージもありません。私はgccコンパイラが下で何をしているのか疑問に思っていますか?

int k;
for(k=INT_MAX; k< LONG_MAX; k++){
    printf("%d\n",k);
}
4

2 に答える 2

2

k は「int」型の変数です。INT_MAX は、signed int に割り当てることができる最大の正の整数値です。"long" と "int" が同じサイズであるコンパイラの実装を使用している場合、"k < LONG_MAX" は true にならず、コードは何も出力しません。ただし、コンパイラの実装で "long" が "int" より大きい場合、k をインクリメントするとオーバーフローし、未定義の動作* が発生します。これがトラップやその他のシグナルにならない場合、典型的な効果は、値が負にラップすることです (0 - MAX_INT - 1 の値を与えます)。したがって、最初のループでは、コードは INT_MAX の値を出力し、k は LONG_MAX より小さい値を比較し、k++ は k の値を 0 - INT_MAX - 1 に設定します。2 回目のループでは、コードはそれを出力します。 、LONG_MAX より小さい場合、k++ は k の値を 0 - INT_MAX に設定します。などなど、無限にループします。(もちろん、CTRL-C を押すまでは。)

*未定義の動作: 悪い。https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow (他の多くの場所の中で)を参照してください) これを避けることが望ましい理由について説明します。

于 2013-04-23T03:49:19.220 に答える