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++更像动物园。很好,以它自己压倒性的方式;)