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

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

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

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

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

26

Решение

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

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

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

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

  • Тип ParameterWorkingIdx,

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

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

  • так далее…

42

Другие решения

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

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

19

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

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

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

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

8

Это действительный код?

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

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

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

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

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

3
По вопросам рекламы [email protected]