在IOS8.1,XCode 6.1.1中使用一些指针算法时,我遇到了编译器错误。经过调试后,我得到了以下代码片段,这些代码片段可以编译并排除不必要的代码。我不明白为什么编译器会以不同的方式解释它们:
struct kd_node_struct* find_median(struct kd_node_struct *startNode, struct kd_node_struct *endNode, int dimensionNumber)
{
//these lines compile fine
struct kd_node_struct *median = endNode - endNode + startNode;
struct kd_node_struct *median2 = (startNode - endNode) / 2;
struct kd_node_struct *median3 = startNode + ( (endNode - startNode) / 2);
//these lines give "invalid operands to binary expression" error
struct kd_node_struct *median4 = endNode + endNode + startNode;
struct kd_node_struct *median5 = (startNode + endNode) / 2;
}
无论语句实际评估的是什么,我都不明白为什么这些操作看起来与编译器不同。除了以+或 - 运算符前导之外,中位数与中位数4有何不同?中位数2和中位数5相同。如果median5失败,我真的不知道median3是如何编译的。
我发现错误信息特别令人困惑......
Invalid operands to binary expression('struct kd_node_struct *' and 'struct kd_node_struct *')
...因为对我来说这看起来像两种相同的类型。
我在这里缺少什么?
*编辑:当median2编译时,它确实有一个警告:
Incompatible integer to pointer conversion initializing 'struct kd_node_struct *' with an expression of type 'long'
答案 0 :(得分:4)
...因为对我来说这看起来像两种相同的类型。
是的,但添加指针是一种荒谬的操作,因此语言不允许这样做。减法很好。
当median2编译时,它确实有一个警告:
是的,因为你已经创建了一个整数(指针差异除以2),并且你正试图用它初始化一个指针变量。
median3
是您拥有的唯一正确/有意义的代码段。 median1
在语法上是正确的,但相当于median = startnode
,这可能不是你想要的。