在浏览我组织的源存储库时,我发现了这个小宝石:
RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
这是有效的代码吗?(它编译)这里的感叹号是做什么的?
反转~
运算符可能有意义,因为它通常与!
布尔表达式中的非运算符混淆。!
但是,将 not运算符强加于数组索引似乎没有逻辑意义。有什么想法吗?
在浏览我组织的源存储库时,我发现了这个小宝石:
RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
这是有效的代码吗?(它编译)这里的感叹号是做什么的?
反转~
运算符可能有意义,因为它通常与!
布尔表达式中的非运算符混淆。!
但是,将 not运算符强加于数组索引似乎没有逻辑意义。有什么想法吗?
!ParameterWorkingIdx
表示ParameterWorkingIdx
是0
,如果是,则!ParameterWorkingIdx
评估为true
,它可能会隐式转换为索引器类型(例如,1
对于数组中的整数索引器),否则,评估为false
。
如果ParameterWorkingIdx == 0
那么[!ParameterWorkingIdx] == [1]
.
如果ParameterWorkingIdx != 0
那么[!ParameterWorkingIdx] == [0]
.
它还取决于其他东西,例如:
的类型ParameterWorkingIdx
。
! operator
的类型的重载ParameterWorkingIdx
。
索引器重载的类型RawParameterStorage
。
ETC...
在这里进行一些猜测,但这看起来像一个双缓冲模式。将在和ParameterWorkingIdx
之间翻转(可能与)。0
1
ParameterWorkingIdx = !ParameterWorkingIdx;
然后,在任何时候,RawParameterStorage[ParameterWorkingIdx]
都将是当前缓冲区,并且RawParameterStorage[!ParameterWorkingIdx]
将是前一个缓冲区。
!
将 not运算符强加在数组索引上似乎没有逻辑意义
它可能:它在这里所做的只是将零转换为一,并将任何其他数字转换为零。
我们可以从这段代码中推断出RawParameterStorage
顶层可能有两个元素。
PS在这里,我假设这RawParameterStorage
是一个数组(如你所说)。此外,我假设它ParameterWorkingIdx
是一个整数(顾名思义)。例如,如果其中一个是具有重载运算符的类,那么语义可能会完全不同。
这是有效的代码吗?
是的。假设ParameterWorkingIdx
是一个int
, for !ParameterWorkingIdx
, 当与 一起使用时operators !
, 它会在上下文中转换为 bool ,
零值(对于整数、浮点和无范围枚举)以及空指针和指向成员的空指针值变为
false
. 所有其他值变为true
。
然后积分提升为用作数组索引。
bool 类型可以转换为 int,其值
false
变为0并true
变为 1。
!ParameterWorkingIdx
与 等价,这ParameterWorkingIdx == 0 ? 1 : 0
在 IMO 中更加清晰。