Просматривая исходный репозиторий моей организации, я наткнулся на этот маленький драгоценный камень:
RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
Это действительный код? (Компилируется) Что делает здесь восклицательный знак?
Инверт ~
оператор может иметь смысл, так как его обычно путают с не !
оператор в логических выражениях. Тем не менее, не представляется логичным навязывать !
оператор по индексу массива. Какие-нибудь мысли?
!ParameterWorkingIdx
Средства ParameterWorkingIdx
является 0
, Если это, !ParameterWorkingIdx
оценивает как true
который может быть неявно преобразован в тип индексатора (например, 1
для целочисленного индексатора, как в массиве), в противном случае он оценивается как false
,
Если ParameterWorkingIdx == 0
затем [!ParameterWorkingIdx] == [1]
,
Если ParameterWorkingIdx != 0
затем [!ParameterWorkingIdx] == [0]
,
Это также зависит от других вещей, таких как:
Тип ParameterWorkingIdx
,
перегрузка ! operator
по типу ParameterWorkingIdx
,
перегрузка индексатора по типу RawParameterStorage
,
так далее…
Здесь нужно немного догадаться, но это похоже на шаблон с двойным буфером. ParameterWorkingIdx
будет шлепать между 0
а также 1
(вероятно, с ParameterWorkingIdx = !ParameterWorkingIdx;
).
Тогда, в любое время, RawParameterStorage[ParameterWorkingIdx]
будет текущий буфер, и RawParameterStorage[!ParameterWorkingIdx]
будет предыдущий буфер.
кажется, не имеет логического смысла навязывать
!
оператор по индексу массива
Это может: все, что здесь делается, это преобразовать ноль в единицу, а любое другое число в ноль.
Из этого кода мы можем сделать вывод, что RawParameterStorage
вероятно, имеет два элемента на верхнем уровне.
П.С. Здесь я предполагаю, что RawParameterStorage
это массив (как вы говорите, это). Кроме того, я предполагаю, что ParameterWorkingIdx
является целым числом (как следует из его названия). Например, если любой из них является классом с перегруженными операторами, семантика может быть совершенно другой.
Это действительный код?
Да, это. предполагать ParameterWorkingIdx
быть int
, за !ParameterWorkingIdx
при использовании с operators !
, это будет контекстно конвертируется в bool,
Нулевое значение (для целочисленного, с плавающей точкой и перечисления с незаданной областью) и нулевой указатель и нулевые значения указателя на член становятся
false
, Все остальные ценности становятсяtrue
,
затем интегрально повышен использоваться в качестве индекса массива.
тип bool может быть преобразован в int со значением
false
становится 0 иtrue
становится 1.
Так !ParameterWorkingIdx
эквивалентно ParameterWorkingIdx == 0 ? 1 : 0
, что гораздо понятнее ИМО.