数组索引中的感叹号有什么作用?

What does an exclamation mark in array index do?

在仔细阅读我组织的源存储库时,我遇到了这个小问题 gem:

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

这个代码有效吗? (编译)这里的感叹号是做什么用的?

反转 ~ 运算符可能有意义,因为它通常与布尔表达式中的非 ! 运算符混淆。但是,将 not ! 运算符强加于数组索引似乎没有逻辑意义。有什么想法吗?

it doesn't seem to make logical sense to impose the not ! operator on an array index

它可能:它在这里所做的只是将零转换为一,并将任何其他数字转换为零。

我们可以从这段代码推断出RawParameterStorage可能在顶层有两个元素。

P. S. 在这里,我假设 RawParameterStorage 是一个数组(如您所说)。此外,我假设 ParameterWorkingIdx 是一个整数(顾名思义)。例如,如果其中一个是带有重载运算符的 class,则语义可能完全不同。

!ParameterWorkingIdx 意味着 ParameterWorkingIdx0,如果是,!ParameterWorkingIdx 计算为 true,这可能会隐式转换为索引器类型(对于例如,1 对于数组中的整数索引器),否则,它的计算结果为 false.

  • 如果ParameterWorkingIdx == 0那么[!ParameterWorkingIdx] == [1].

  • 如果ParameterWorkingIdx != 0那么[!ParameterWorkingIdx] == [0].

它还取决于其他东西,例如:

  • ParameterWorkingIdx的类型。

  • ParameterWorkingIdx 类型重载 ! operator

  • 索引器按 RawParameterStorage.

  • 类型重载
  • 等...

Is this valid code?

是的。假设 ParameterWorkingIdx 是一个 int,对于 !ParameterWorkingIdx,当与 operators ! 一起使用时,它将是 contextually convertible to bool

The value zero (for integral, floating-point, and unscoped enumeration) and the null pointer and the null pointer-to-member values become false. All other values become true.

然后integral promoted作为数组索引。

the type bool can be converted to int with the value false becoming ​0​ and true becoming 1.

所以!ParameterWorkingIdx等价于ParameterWorkingIdx == 0 ? 1 : 0,IMO更清晰。

这里稍微猜测一下,但这看起来像是双缓冲区模式。 ParameterWorkingIdx 会在 01 之间翻转(可能 ParameterWorkingIdx = !ParameterWorkingIdx;)。

那么,在任何时候,RawParameterStorage[ParameterWorkingIdx] 将是当前缓冲区,而 RawParameterStorage[!ParameterWorkingIdx] 将是前一个缓冲区。