Подтвердить что ты не робот

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

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

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

Это действующий код? (Он компилирует) Что делает восклицательный знак?

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

4b9b3361

Ответ 1

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

  • Если ParameterWorkingIdx == 0, то [!ParameterWorkingIdx] == [1].

  • Если ParameterWorkingIdx != 0, то [!ParameterWorkingIdx] == [0].

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

  • Тип ParameterWorkingIdx.

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

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

  • и т.д...

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

Этот допустимый код?

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

Значение нуля (для интегральной, с плавающей запятой и неперечисленным перечислением) и нулевой указатель и значения с нулевым указателем-членом становятся false. Все остальные значения становятся true.

Затем интеграл, продвигаемый, который будет использоваться как индекс массива.

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

Итак, !ParameterWorkingIdx эквивалентно ParameterWorkingIdx == 0 ? 1 : 0, что намного яснее. IMO.