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 hacentrue
.
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 ytrue
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 deParameterWorkingIdx
.sobrecarga del indizador por el tipo de
RawParameterStorage
.etc ...