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

时间:2016-09-13 13:42:49

标签: c++ arrays indexing indexer not-operator

在浏览我的组织的源代码库时,我遇到了这个小宝石:

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

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

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

4 个答案:

答案 0 :(得分:42)

!ParameterWorkingIdx方式ParameterWorkingIdx0,如果是,!ParameterWorkingIdx计算为true,可能会隐式转换为索引器类型(例如, {(1}}表示整数索引器,如数组),否则,它的计算结果为1

  • 如果falseParameterWorkingIdx == 0

  • 如果[!ParameterWorkingIdx] == [1]ParameterWorkingIdx != 0

它还取决于其他东西:

  • [!ParameterWorkingIdx] == [0]

  • 的类型
  • ParameterWorkingIdx类型重载! operator

  • 使用ParameterWorkingIdx

  • 类型的索引器重载
  • 等...

答案 1 :(得分:19)

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

然后,RawParameterStorage[ParameterWorkingIdx]在任何时候都是当前​​缓冲区,而RawParameterStorage[!ParameterWorkingIdx]将是前一个缓冲区。

答案 2 :(得分:8)

  

在数组索引上强加非!运算符似乎没有逻辑意义

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

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

P上。 S.在这里,我假设RawParameterStorage是一个数组(就像你说的那样)。此外,我假设ParameterWorkingIdx是一个整数(顾名思义)。例如,如果是一个具有重载运算符的类,那么语义可能完全不同。

答案 3 :(得分:3)

  

这是有效的代码吗?

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

  

零值(对于整数,浮点和未整数枚举)和空指针以及空指针到成员值变为false。所有其他值都变为true

然后integral promoted用作数组索引。

  

bool类型可以转换为int,值false变为0,true变为1。

所以!ParameterWorkingIdxParameterWorkingIdx == 0 ? 1 : 0相同,这更加明确IMO。