数组索引中的感叹号有什么作用?
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
意味着 ParameterWorkingIdx
是 0
,如果是,!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
会在 0
和 1
之间翻转(可能 ParameterWorkingIdx = !ParameterWorkingIdx;
)。
那么,在任何时候,RawParameterStorage[ParameterWorkingIdx]
将是当前缓冲区,而 RawParameterStorage[!ParameterWorkingIdx]
将是前一个缓冲区。
在仔细阅读我组织的源存储库时,我遇到了这个小问题 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
意味着 ParameterWorkingIdx
是 0
,如果是,!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 becometrue
.
然后integral promoted作为数组索引。
the type bool can be converted to int with the value
false
becoming 0 andtrue
becoming 1.
所以!ParameterWorkingIdx
等价于ParameterWorkingIdx == 0 ? 1 : 0
,IMO更清晰。
这里稍微猜测一下,但这看起来像是双缓冲区模式。 ParameterWorkingIdx
会在 0
和 1
之间翻转(可能 ParameterWorkingIdx = !ParameterWorkingIdx;
)。
那么,在任何时候,RawParameterStorage[ParameterWorkingIdx]
将是当前缓冲区,而 RawParameterStorage[!ParameterWorkingIdx]
将是前一个缓冲区。