0

以下のコードは何をしますか?私はその働きに非常に混乱しています。ifループはintの範囲まで実行されると思ったからです。しかし、の値を出力しようとすると混乱しますi。これを手伝ってください。

#include<stdio.h>

void main()
{
    static int i;
    for (;;)
        if (i+++”Apple”)
            printf(“Banana”);
        else
            break;
}
4

3 に答える 3

3

として解釈されi++ + "Apple"ます。iは静的で初期化子がないため、i ++は0を生成します。したがって、式全体は。0 + some addressまたはと同等if ("Apple")です。

編集

Jonathan Lefflerがコメントで正しく指摘しているように、上記で述べたことは最初の反復にのみ適用されます。その後、それは増加iし続け、「バナナ」を印刷し続けます。

ある時点で、オーバーフローが原因で(クラッシュしない場合)、0が生成され、ループが中断されると思います。"Apple" + i繰り返しになりますが、ポインタと多数を追加したときに、意味のあるコンパイラが何をすべきかはよくわかりません。

Eric Postpischilがコメントしたように、ポインターは、割り当てられたスペースの1つを指すまでしか前進できません。たとえば、7を追加すると、ポインタが割り当てられたスペース( "Apples \ 0")を1つ超えて進みます。さらに追加することは未定義の動作であり、技術的に奇妙なことが起こる可能性があります。

于 2012-12-28T17:47:14.340 に答える
2

int main(void)の代わりに使用してくださいvoid main()

式は;i+++"Apple"として解析されます。(i++) + "Apple"文字列リテラルは、タイプ「6要素配列」から「ポインタへ」"Apple"の式に変換され、その値は配列の最初の要素のアドレスです。式はの現在の値に評価され、副作用として、の値が1ずつ増加します。charchari++ii

したがって、整数式の結果を、式の結果i++のポインター値に追加し"Apple"ます。これにより、のアドレス以上の新しいポインタ値が得られます"Apple"。したがって、文字列リテラルのアドレス"Apple"が0x80123450であると仮定すると、基本的に値を評価しています。

0x80123450 + 0
0x80123450 + 1
0x80123450 + 2
...

これらはすべてゼロ以外と評価される必要があります。これにより、printfステートメントが実行されます。問題はi++、整数のオーバーフロー(動作が明確に定義されていない)が発生した場合、またはの値がi+++"Apple"ポインタ値のオーバーフローを発生した場合にどうなるかです。i+++"Apple"値が0の式になる かどうかは明らかではありません。

于 2012-12-28T18:05:26.830 に答える
1

このコードは次のように記述されている必要があります。

char *apple = "Apple";
for(i = 0; apple[i++];)
    printf("Banana");

オリジナルに投稿されたコードよりも明確であるだけでなく、それが何をするのかを確認することもより明確です。しかし、これは「Cで物事を書くことがどれほど奇妙なことか見てください」から来たと思います。Cで可能なことはたくさんありますが、それは素晴らしいアイデアではありません。

自分で夕食を提供する目的で、頭の上の温かい食べ物のバランスをとることを学ぶことも可能です。それは特に素晴らしいアイデアにはなりません-あなたが手と足を持っていない限り、私は推測します...;)

編集:これが間違っていることを除いて...同等のものは:

char *apple = "Apple";
for(i = 0; apple+i++ != NULL;)
    printf("Banana");

64ビットマシンでは、これにはしばらく時間がかかります。妥当な時間(/ dev / nullに出力を送信)で終了したら、更新します。私のマシン(AMD 3.4GHz Phenom II)では約3分かかります。

于 2012-12-28T21:17:51.077 に答える