在浏览我的组织的源代码库时,我遇到了这个小宝石:
RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
这是有效的代码吗? (它编译)这里的感叹号是做什么的?
反转~
运算符可能有意义,因为它通常与布尔表达式中的非!
运算符混淆。但是,在数组索引上强加非!
运算符似乎没有逻辑意义。有什么想法?
答案 0 :(得分:42)
!ParameterWorkingIdx
方式ParameterWorkingIdx
为0
,如果是,!ParameterWorkingIdx
计算为true
,可能会隐式转换为索引器类型(例如, {(1}}表示整数索引器,如数组),否则,它的计算结果为1
。
如果false
则ParameterWorkingIdx == 0
。
如果[!ParameterWorkingIdx] == [1]
则ParameterWorkingIdx != 0
。
它还取决于其他东西:
[!ParameterWorkingIdx] == [0]
。
按ParameterWorkingIdx
类型重载! operator
。
使用ParameterWorkingIdx
。
等...
答案 1 :(得分:19)
在这里进行一些猜测,但这看起来像一个双缓冲模式。 ParameterWorkingIdx
会在0
和1
之间翻转(可能是ParameterWorkingIdx = !ParameterWorkingIdx;
)。
然后,RawParameterStorage[ParameterWorkingIdx]
在任何时候都是当前缓冲区,而RawParameterStorage[!ParameterWorkingIdx]
将是前一个缓冲区。
答案 2 :(得分:8)
在数组索引上强加非
!
运算符似乎没有逻辑意义
它可能:它在这里所做的只是将零转换为1,将任何其他数字转换为零。
我们可以从这段代码中推断RawParameterStorage
可能在顶层有两个元素。
P上。 S.在这里,我假设RawParameterStorage
是一个数组(就像你说的那样)。此外,我假设ParameterWorkingIdx
是一个整数(顾名思义)。例如,如果是一个具有重载运算符的类,那么语义可能完全不同。
答案 3 :(得分:3)
这是有效的代码吗?
是的。假设ParameterWorkingIdx
为int
,对于!ParameterWorkingIdx
,与operators !
一起使用时,它将为contextually convertible to bool,
零值(对于整数,浮点和未整数枚举)和空指针以及空指针到成员值变为
false
。所有其他值都变为true
。
然后integral promoted用作数组索引。
bool类型可以转换为int,值
false
变为0,true
变为1。
所以!ParameterWorkingIdx
与ParameterWorkingIdx == 0 ? 1 : 0
相同,这更加明确IMO。