1

重複の可能性:
C および C++ でのインデックス [配列] による配列へのアクセス

#include <stdio.h>
int main()
{       
    int a=3, b = 5;
    printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
    printf(&a["WHAT%c%c%c  %c%c  %c !\n"], 1["this"],
    2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);

    return 0;
}

これは私が授業で与えられた練習問題の 1 つです。このコードがどのようにして出力に到達したかを理解しようとしています。

こんにちは!これはどのように?超 それは C です !

&a[" %s"] 操作。それはどのように機能しますか?セコと一緒

4

2 に答える 2

3

コード

&a["Ya!Hello! how is this? %s\n"]

次のように解釈されます

&(a["Ya!Hello! how is this? %s\n"])

すべての C スタイルの文字列はポインターであるため、これは奇妙ですが、次の事実の合法的な使用法です。

arr[i]

i[arr]

どちらも C では有効です。したがって、コードは次のように解釈する必要があります。

&("Ya!Hello! how is this? %s\n"[a])

そしてa = 3、これがキャラクターHです。この文字のアドレスを取得するため、C スタイルの文字列へのポインターが得られます。

"Hello! how is this? %s\n"

これを出発点として使用して、プログラムの残りの部分をデコードしてみることができます。

お役に立てれば!

于 2012-12-12T03:28:27.330 に答える
1

まず、文字列リテラルはchar要素の配列であることを理解する必要があります。つまり、他の配列を使用するのと同じ方法で文字列リテラルを使用できます。これは合法的なC式です

"hello"[i]

iこれは、文字列「hello」のth文字に評価されます。たとえば、"hello"[1]を格納する文字へのアクセスを提供しますe

第二に、あなたはそれを合法的なa[i]表現aで理解する必要がiあり、表現の意味を変えることなく交換することができます。この意味は

i["hello"]

iまた、合法であり、文字列「hello」のth文字へのアクセスも提供します。したがって、iが2に等しい場合はi["hello"]、最初のを参照しlます。

さて、あなたがそれが何であるか、そしてそれがどのように機能するかを知っているprintfと仮定すると、これは元のコードを解読するのにすでに十分です。

于 2012-12-12T03:44:33.983 に答える