Что делает восклицательный знак в индексе массива?

просматривая исходный репозиторий моей организации, я наткнулся на этот маленький драгоценный камень:

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

это правильный код? Что делает восклицательный знак здесь?

инвертировать ~ оператор может иметь смысл, так как его обычно путают с not ! оператор в логических выражениях. Однако, кажется, не имеет логического смысла навязывать not ! оператор индекса массива. Есть Мысли?

4 ответов


!ParameterWorkingIdx означает ParameterWorkingIdx is 0, Если это, !ParameterWorkingIdx оценивается как true что может быть неявно преобразован в тип индексатора (например, 1 для целочисленного индексатора, как в массиве), в противном случае он вычисляется как false.

  • если ParameterWorkingIdx == 0 затем [!ParameterWorkingIdx] == [1].

  • если ParameterWorkingIdx != 0 затем [!ParameterWorkingIdx] == [0].

он также зависит от других вещей, таких как:

  • тип ParameterWorkingIdx.

  • перегрузка ! operator по типу ParameterWorkingIdx.

  • перегрузка индексатора по типу RawParameterStorage.

  • etc...


немного угадываю здесь, но это похоже на шаблон с двойным буфером. ParameterWorkingIdx будет флип-флоп между 0 и 1 (вероятно, с ParameterWorkingIdx = !ParameterWorkingIdx;).

тогда, в любое время,RawParameterStorage[ParameterWorkingIdx] будет текущим буфером, и RawParameterStorage[!ParameterWorkingIdx] будет предыдущим буфером.


кажется, нет логического смысла навязывать not ! оператор на индексе массива

это может: все, что он делает здесь, это преобразовать ноль в один, а любое другое число в ноль.

из этого кода можно сделать вывод, что RawParameterStorage вероятно, имеет два элемента на верхнем уровне.

P. S. Здесь, я предполагаю, что RawParameterStorage является массивом (как вы говорите). Более того, я предполагаю, что ParameterWorkingIdx - целое число (как следует из его названия). Если, например, либо это класс с перегруженными операторами, чем семантика может быть абсолютно разным.


это правильный код?

Да, это так. Предположим ParameterWorkingIdx быть int, for !ParameterWorkingIdx при использовании operators !, будет контекстно конвертируемый в bool,

нулевое значение (для перечисления integral, floating-point и unscoped) и нулевой указатель и значения нулевого указателя на член становятся false. Все остальные значения становятся true.

затем Интеграл повышен для использования в качестве индекса массива.

тип bool может быть преобразован в int со значением false становится 0 и true становится 1.

так !ParameterWorkingIdx эквивалентно ParameterWorkingIdx == 0 ? 1 : 0, что гораздо более ясно ИМО.