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

Jim*_*ell 26 c++ arrays indexing indexer not-operator

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

RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
Run Code Online (Sandbox Code Playgroud)

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

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

Tam*_*red 42

!ParameterWorkingIdx手段ParameterWorkingIdx0,如果是,!ParameterWorkingIdx计算为true这可能(例如,隐式转换为分度器类型1中的阵列为整数索引为),否则,它的计算结果作为false.

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

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

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

  • 的类型ParameterWorkingIdx.

  • 超载! operator的类型ParameterWorkingIdx.

  • 索引器重载的类型RawParameterStorage.

  • 等等...

  • `"你"+ ["是","不是"] [!loggedIn()] +"登录."`←JavaScript中相同想法的一个例子.同意icky,但不是C的错! (12认同)
  • @ ThomasPadron-McCarthy C就像一只小猫,C++更像是一个动物园.这很好,以自己压倒一切的方式;) (3认同)

Que*_*tin 19

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

然后,在任何时候,RawParameterStorage[ParameterWorkingIdx]将是当前缓冲区,RawParameterStorage[!ParameterWorkingIdx]并将是以前的缓冲区.


NPE*_*NPE 8

将not !运算符强加于数组索引似乎没有逻辑意义

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

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

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

  • UV'd但是这确实假设`ParameterWorkingIdx`不是具有重载的类的实例!运营商.OP会明智地检查一下. (2认同)