私はこのコードに出くわしました。coutステートメントでは、条件はtrueと評価されます。
a[10][10]=’h’;
cout<<(a[0]==*a)&&(*a==0[a]);
を使用して配列要素/アドレスにアクセスするの0[a]
は新しいことです。誰かがこのタイプの表記法を説明できますか?
http://c-faq.com/aryptr/joke.htmlから
Q:式5["abcdef"]を含むジョークコードに出くわしました。どうしてこれが合法的なCになるのでしょうか?
A:はい、バージニア州、配列の添え字はCで可換です。[脚注]この奇妙な事実は、配列の添え字のポインター定義に由来します。つまり、a [e]は*((a)+(e))と同じです。 2つの式aとe。ただし、一方がポインター式で、もう一方が整数である場合に限ります。「証拠」は次のようになります
a[e]
*((a) + (e)) (by definition)
*((e) + (a)) (by commutativity of addition)
e[a] (by definition)
この予想外の可換性は、Cのテキストで誇らしげなものであるかのように言及されることがよくありますが、難読化されたCコンテスト以外では有用なアプリケーションは見つかりません(質問20.36を参照)。
Cの文字列はcharの配列であるため、式 "abcdef" [5]は完全に有効であり、文字'f'に評価されます。あなたはそれを略記と考えることができます
char *tmpptr = "abcdef";
... tmpptr[5] ...
Cでは、0[a]
はとまったく同じ意味を持ちa[0]
、どちらも。と同等*a
です。CFAQを参照してください。
ポインタである限りa
、これらの式はすべて、C++でもCと同じセマンティクスを持っています。
a
オブジェクトへのポインタであると仮定すると、これらの式は常に同じです。
*a
0[a]
a[0]
これは、これらの式が同じで(a[0]==*a)
あり(*a==0[a])
、両方ともに評価されることを意味し1
ます。