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

C++ 数组索引中的感叹号有什么作用?,c++,arrays,indexing,indexer,not-operator,C++,Arrays,Indexing,Indexer,Not Operator,在浏览我所在组织的源代码存储库时,我发现了以下一点: RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ... 这是有效代码吗?(编译)这里的感叹号是干什么的 反转~运算符可能是有意义的,因为它通常与非运算符混淆运算符。然而,强加not似乎没有逻辑意义运算符。有什么想法吗 强加not似乎没有逻辑意义运算符 它可能是:它在这里所做的就是将0转换为1,将任何其他数字转换为0 我们可以从这段代码推断,RawParamet

在浏览我所在组织的源代码存储库时,我发现了以下一点:

RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
这是有效代码吗?(编译)这里的感叹号是干什么的

反转
~
运算符可能是有意义的,因为它通常与非
运算符混淆运算符。然而,强加not
似乎没有逻辑意义运算符。有什么想法吗

强加not
似乎没有逻辑意义运算符

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

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


这里,我假设
RawParameterStorage
是一个数组(正如您所说)。此外,我假设
参数workingidx
是一个整数(顾名思义)。例如,如果其中一个是具有重载运算符的类,则语义可能完全不同。

!ParameterWorkingIdx
表示
ParameterWorkingIdx
0
,如果为
!ParameterWorkingIdx
计算结果为
true
,可能隐式转换为索引器类型(例如,对于数组中的整数索引器,
1
),否则计算结果为
false

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

  • 如果
    参数workingidx!=0
    然后
    [!ParameterWorkingIdx]==[0]

这还取决于其他因素,如:

  • 参数workingidx的类型

  • 的重载!操作员
    参数workingidx
    的类型

  • RawParameterStorage
    类型的索引器重载

  • 等等

这是有效代码吗

是的。假设
参数workingidx
int
!参数workingidx
,与
运算符一起使用时,它将是

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

然后用作数组索引

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


所以
!ParameterWorkingIdx
ParameterWorkingIdx==0等效?1:0
,这在我看来更清楚。

这里有点猜测,但这看起来像是双缓冲区模式
ParameterWorkingIdx
将在
0
1
之间切换(可能使用
ParameterWorkingIdx=!ParameterWorkingIdx;


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

UV'd,但这确实假设
ParameterWorkingIdx
不是重载类的实例!操作人员检察官最好检查一下。@Bathsheba:说得好。为了完整起见,我要补充几句。这样写不会在代码中生成分支指令,尽管直接目的可能并不明显…@XapaJIaMnu我们编写的代码是供人阅读的,而不仅仅是供计算机阅读的。:)如果该块的性能非常重要,避免使用分支指令是有帮助的,那么只需添加三元条件版本作为注释。我想说的是,当眼前的目的不明显时,人们应该通过评论来表明,大卫·海曼是什么said@XapaJIaMnu在这种情况下,解释为什么必须调用这种特殊语言魔法的清晰而明确的文档应该放在源代码中。
“您”+[“是”、“不是”][!loggedIn()]+“已登录。”
← JavaScript中的一个相同想法的示例。同意,讨厌,但不是C的错!我认为你需要删除第一句中的“不同于”。在它当前的形式中,它与您想说的正好相反。@j6m8实际上与JS中的情况不同,属性被强制转换为字符串,布尔值最终变成
“true”
/
“false”
。所以,无论是使用< > > > [“不”]、“是”】+“登录”< <代码> >或>代码>“你”+{false:“都不”,真:“是”}[LogGeDIN()] +“登录”< /> > ThomasPadron McCarthy C就像小猫,C++更像动物园。很好,以它自己压倒性的方式;)