utiliza tres signos signo significa que puntuacion para niños los interrogacion inicial importancia exclamacion estos como admiracion c++ arrays indexing indexer not-operator

c++ - tres - ¿Qué hace un signo de exclamación en el índice de matriz?



signos de interrogacion y exclamacion (4)

Mientras hojeaba el repositorio de fuentes de mi organización encontré esta pequeña joya:

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

¿Es este código válido? (Compila) ¿Qué hace el signo de exclamación aquí?

Un operador de inversión podría tener sentido, ¡ya que comúnmente se confunde con el no ! operador en expresiones booleanas. Sin embargo, no parece tener sentido lógico imponer el no ! operador en un índice de matriz. ¿Alguna idea?


¡no parece tener sentido lógico imponer el no ! operador en un índice de matriz

Podría: todo lo que hace aquí es convertir cero en uno, y cualquier otro número en cero.

Podemos deducir de este código que RawParameterStorage probablemente tenga dos elementos en el nivel superior.

PD Aquí, supongo que RawParameterStorage es una matriz (como usted dice que es). Además, supongo que ParameterWorkingIdx es un número entero (como su nombre lo indica). Si, por ejemplo, cualquiera de las dos es una clase con operadores sobrecargados, la semántica podría ser completamente diferente.


¿Es este código válido?

Sí lo es. Supongamos que ParameterWorkingIdx es un int , for !ParameterWorkingIdx , cuando se usa con operators ! , será contextualmente convertible a bool ,

El valor cero (para la enumeración integral, de coma flotante y no codificada) y el puntero nulo y los valores de puntero nulo a miembro se vuelven false . Todos los demás valores se hacen true .

Luego integral promovido para ser utilizado como el índice de matriz.

el tipo bool se puede convertir a int con el valor false convierte en 0 y true en 1.

Entonces !ParameterWorkingIdx es equivalente con ParameterWorkingIdx == 0 ? 1 : 0 ParameterWorkingIdx == 0 ? 1 : 0 , que es mucho más claro IMO.


Tomando un poco de conjetura aquí, pero eso parece un patrón de doble buffer. ParameterWorkingIdx fluctuaría entre 0 y 1 (probablemente con ParameterWorkingIdx = !ParameterWorkingIdx; ).

Entonces, en cualquier momento, RawParameterStorage[ParameterWorkingIdx] sería el buffer actual, y RawParameterStorage[!ParameterWorkingIdx] sería el buffer anterior.


!ParameterWorkingIdx Means ParameterWorkingIdx es 0 , si lo es !ParameterWorkingIdx evalúa como true que podría convertirse implícitamente en el tipo de indizador (por ejemplo, 1 para el indizador entero como en una matriz), de lo contrario, se evalúa como false .

  • Si ParameterWorkingIdx == 0 entonces [!ParameterWorkingIdx] == [1] .

  • Si ParameterWorkingIdx != 0 entonces [!ParameterWorkingIdx] == [0] .

También depende de otras cosas como:

  • El tipo de ParameterWorkingIdx .

  • sobrecarga de ! operator ! operator por el tipo de ParameterWorkingIdx .

  • sobrecarga del indizador por el tipo de RawParameterStorage .

  • etc ...