私の組織のソースリポジトリを熟読しているときに、この小さな宝石を見つけました。
RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
これは有効なコードですか? (コンパイルします)ここの感嘆符は何をしますか?
反転~
演算子は、ブール式のnot !
演算子と混同されるため、意味があるかもしれません。ただし、配列インデックスにnot !
演算子を課すことは論理的に意味がないようです。何かご意見は?
!ParameterWorkingIdx
はParameterWorkingIdx
が0
であることを意味します。そうである場合、!ParameterWorkingIdx
はtrue
として評価され、暗黙的にインデクサータイプに変換される場合があります(たとえば、1
は配列のような整数インデクサーの場合)、それ以外の場合はfalse
と評価されます。
ParameterWorkingIdx == 0
の場合は[!ParameterWorkingIdx] == [1]
。
ParameterWorkingIdx != 0
の場合は[!ParameterWorkingIdx] == [0]
。
また、次のようなものにも依存します。
ParameterWorkingIdx
のタイプ。
ParameterWorkingIdx
のタイプによる! operator
のオーバーロード。
RawParameterStorage
のタイプによるインデクサーのオーバーロード。
等...
ここでは少し推測しますが、それはダブルバッファパターンのように見えます。 ParameterWorkingIdx
は0
および1
(おそらくParameterWorkingIdx = !ParameterWorkingIdx;
)。
その後、いつでもRawParameterStorage[ParameterWorkingIdx]
は現在のバッファであり、RawParameterStorage[!ParameterWorkingIdx]
は前のバッファになります。
配列インデックスにnot
!
演算子を課すことは論理的に意味がないようです
それは可能性があります:ここで行うことは、ゼロを1に変換し、その他の数値をゼロに変換することだけです。
このコードから、RawParameterStorage
にはおそらく最上位に2つの要素があると推測できます。
P. S.ここで、私はRawParameterStorage
が配列であると想定しています(あなたが言うとおりです)。さらに、ParameterWorkingIdx
は整数であると想定しています(その名前が示すとおり)。たとえば、どちらかがオーバーロードされた演算子を持つクラスである場合、セマンティクスは完全に異なる可能性があります。
これは有効なコードですか?
はい、そうです。 ParameterWorkingIdx
がint
であると仮定します。!ParameterWorkingIdx
の場合、operators !
と一緒に使用すると、 contextually convertible to bool 、
値0(整数、浮動小数点、およびスコープなしの列挙)、およびnullポインターとnullポインターからメンバーへの値は
false
になります。他のすべての値はtrue
になります。
次に 積分プロモート を配列のインデックスとして使用します。
タイプboolは、値
false
が0になり、true
が1になるintに変換できます。
そのため、!ParameterWorkingIdx
はParameterWorkingIdx == 0 ? 1 : 0
と同等で、IMOがより明確になります。