web-dev-qa-db-ja.com

配列インデックスの感嘆符は何をしますか?

私の組織のソースリポジトリを熟読しているときに、この小さな宝石を見つけました。

RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...

これは有効なコードですか? (コンパイルします)ここの感嘆符は何をしますか?

反転~演算子は、ブール式のnot !演算子と混同されるため、意味があるかもしれません。ただし、配列インデックスにnot !演算子を課すことは論理的に意味がないようです。何かご意見は?

27
Jim Fell

!ParameterWorkingIdxParameterWorkingIdx0であることを意味します。そうである場合、!ParameterWorkingIdxtrueとして評価され、暗黙的にインデクサータイプに変換される場合があります(たとえば、1は配列のような整数インデクサーの場合)、それ以外の場合はfalseと評価されます。

  • ParameterWorkingIdx == 0の場合は[!ParameterWorkingIdx] == [1]

  • ParameterWorkingIdx != 0の場合は[!ParameterWorkingIdx] == [0]

また、次のようなものにも依存します。

  • ParameterWorkingIdxのタイプ。

  • ParameterWorkingIdxのタイプによる! operatorのオーバーロード。

  • RawParameterStorageのタイプによるインデクサーのオーバーロード。

  • 等...

42
Tamir Vered

ここでは少し推測しますが、それはダブルバッファパターンのように見えます。 ParameterWorkingIdx0および1(おそらくParameterWorkingIdx = !ParameterWorkingIdx;)。

その後、いつでもRawParameterStorage[ParameterWorkingIdx]は現在のバッファであり、RawParameterStorage[!ParameterWorkingIdx]は前のバッファになります。

19
Quentin

配列インデックスにnot !演算子を課すことは論理的に意味がないようです

それは可能性があります:ここで行うことは、ゼロを1に変換し、その他の数値をゼロに変換することだけです。

このコードから、RawParameterStorageにはおそらく最上位に2つの要素があると推測できます。

P. S.ここで、私はRawParameterStorageが配列であると想定しています(あなたが言うとおりです)。さらに、ParameterWorkingIdxは整数であると想定しています(その名前が示すとおり)。たとえば、どちらかがオーバーロードされた演算子を持つクラスである場合、セマンティクスは完全に異なる可能性があります。

8
NPE

これは有効なコードですか?

はい、そうです。 ParameterWorkingIdxintであると仮定します。!ParameterWorkingIdxの場合、operators !と一緒に使用すると、 contextually convertible to bool

値0(整数、浮動小数点、およびスコープなしの列挙)、およびnullポインターとnullポインターからメンバーへの値はfalseになります。他のすべての値はtrueになります。

次に 積分プロモート を配列のインデックスとして使用します。

タイプboolは、値falseが0になり、trueが1になるintに変換できます。

そのため、!ParameterWorkingIdxParameterWorkingIdx == 0 ? 1 : 0と同等で、IMOがより明確になります。

3
songyuanyao