27

在浏览我组织的源存储库时,我发现了这个小宝石:

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

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

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

4

4 回答 4

43

!ParameterWorkingIdx表示ParameterWorkingIdx0,如果是,则!ParameterWorkingIdx评估为true,它可能会隐式转换为索引器类型(例如,1对于数组中的整数索引器),否则,评估为false

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

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

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

  • 的类型ParameterWorkingIdx

  • ! operator的类型的重载ParameterWorkingIdx

  • 索引器重载的类型RawParameterStorage

  • ETC...

于 2016-09-13T13:45:16.460 回答
19

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

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

于 2016-09-13T13:57:47.127 回答
8

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

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

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

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

于 2016-09-13T13:45:02.253 回答
3

这是有效的代码吗?

是的。假设ParameterWorkingIdx是一个int, for !ParameterWorkingIdx, 当与 一起使用时operators !, 它会在上下文中转换为 bool ,

零值(对于整数、浮点和无范围枚举)以及空指针和指向成员的空指针值变为false. 所有其他值变为true

然后积分提升为用作数组索引。

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

!ParameterWorkingIdx与 等价,这ParameterWorkingIdx == 0 ? 1 : 0在 IMO 中更加清晰。

于 2016-09-13T13:57:16.037 回答