反对按位操作上的 int 强制转换
object to int casting on bitwise operation
嗨,伙计们,这是我第二次尝试解释C++代码(我是一个非常新手(,我只想确保以下代码的含义C++:
//| Get other endpoint of an edge |
//+--------------------------------+
inline Node *Node::NextNode( Edge *next)
{
return (Node *) ((!next) ? NULL : ( (int)next->node[0] ^ (int)next->node[1] ^ (int)this ) );
}
代码是否意味着将对象转换为next->node[0]
和next->node[1]
int,并将 XOR 运算符应用于它们的位值? 并使用结果作为对Node*
的引用作为回报?提前感谢您的帮助:)
是的。(虽然你也忽略了三元和演员阵容(
请记住,除非您非常小心,否则此类代码可能具有未定义的行为并且不可移植(例如,在 x86-64 上,指针大于整数(。
我在这里最好的猜测是Edge
表示两个Node
之间的边,定义如下
struct Edge {
Node *node[2];
// perhaps other fields
}
node
中的两个元素都必须填写。它们可能指向不同的节点,或者至关重要的是,它们可能指向同一节点。
此外,Node::NextNode()
只能传递一个Edge
对象,该对象包含节点本身作为边缘上的两个node
元素之一(或者可以传递 NULL(。
鉴于此,此函数基本上等价于
if (next) {
if (next->node[0] == next->node[1]) return this;
if (next->node[0] == this) return next->node[1];
return next->node[0];
}
return NULL;
尽管正如 Antimy 指出的那样,它实际上是有缺陷的,因为它正在投射到 int
在任何指针大于整数的架构上都会表现不正确。当然,如果您不满足不变量,该函数的行为将不正确(例如,您传入的Edge
不包含节点作为其两个node
中的任何一个(。
你的解释是正确的。 这是非常奇怪的代码。 通常不会将一些整数x或在一起,而是将结果视为指针。
查看 node
声明附近的头文件,看看字段编码的内容。 如果没有这样的评论,请尽快逃离此代码!
(int)next->node[0] ^ (int)next->node[1] ^ (int)this
鉴于 next->node[0] 和 [1] 显然是指针,在隔离中看到它们的 XOR 提供了一个无意义的值(除了它们相等的微不足道的情况(,但考虑到期望与 this
进行 XOR 会产生有意义的东西,我假设其中一个 node[] 值已知是this
的,这样我们就剩下没有this
的那个。 换句话说,对于此方案,代码可能等效于:
next->node[next->node[0] == this]
(或者如果这有点神秘,你可能更喜欢next->node[next->node[0] == this ? 1 : 0]
;当一个数字是预期的时,C++ true
转换为 1 和 false
转换为 0(
源代码中的注释"获取边缘的其他端点">似乎支持这一点:显然知道this
是一个端点,并且代码找到"另一个"端点。
生成有效指针的另一种情况是,当node[0]
和node[1]
相同时,将返回this
。 如果打算支持此方案(而不仅仅是实现的巧合(,则上述建议的简化将失败。 你可以试试:
next->node[0] == next->node[1] ? this : next->node[next->node[0] == this]
如果对运行时数据是否可以包含两个相同的节点值有任何疑问,那么这种替换更安全。
正如其他人指出的那样,代码假设指针的大小与int
相同,这很讨厌! 我不会像其他地方那样讨论它,但请记住这一点。
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度