以下陈述如何评估?

时间:2011-03-08 15:36:25

标签: c++

我对以下陈述的含义(不是第三级运营商部分)有疑问(

return(((*data)*(tmp_left)<(*data)*(tmp_right))?tmp_left:tmp_right);

其中数据是指针, tmp_left 是int类型的变量。该行与树结构有关,如果有帮助的话。

确切地说,我想知道(*data)*(tmp_left)是什么意思?它是指针指向的值还是由它访问的成员变量?指针和变量之间的星号'*'表示什么?

7 个答案:

答案 0 :(得分:3)

(*data)*(tmp_left) - 由于data是一个指针,(*data)取消引用它(获取值,由data指向,然后该值乘以tmp_left (在你的情况下,如你所说,int

其他部分应该清楚:)


编辑:您可以通过将其分成不同的部分来轻松阅读这些内容 return(((*data)*(tmp_left)<(*data)*(tmp_right))?tmp_left:tmp_right);

1. (*data) - get the value, pointed by data
2. tmp_left is an int
3. multiply (*data) and tmp_left (lets say the value is X)
4. (*data) - get the value, pointed by data
5. tmp_right is an int
6. multiply (*data) and tmp_right (lets say the value is Y)
7. now compare X and Y
8. if X < Y, return tmp_left, else return tmp_right

答案 1 :(得分:3)

(* data)*(tmp_left)取消引用数据指针的值,并将结果值乘以tmp_left。

总的来说,如果'd'是数据指向的值,则表示“if(d * tmp_left)小于(d * tmp_right),返回tmp_left,否则返回tmp_right”。

答案 2 :(得分:3)

在不知道数据类型的情况下,并且知道它在树中使用(假设它是BST),这看起来像是数据值的比较。

实质上,当您拥有BST时,您将在直接节点的左侧或直接节点的右侧插入节点。看起来数据值包含在节点中并且是指针。所以,(* data)对节点进行了描述。 (* data)* tmp_left将值相乘。

其余的是比较声明。如果表达式的左侧小于右侧大小,请使用tmp_left数据值。否则,继续向右。

答案 3 :(得分:1)

What does the asterisk '*' between the pointer and a variable signify?

Multiplication(在此上下文中)

答案 4 :(得分:1)

return(((*data)*(tmp_left)<(*data)*(tmp_right))?tmp_left:tmp_right);

让我们简化一下,

int a = (*data);         //get the value from the address pointed to be 'data'
int x = a * (tmp_left);  //multiplication
int y = a * (tmp_right); //multiplication 

//substitute x and y in the original expression, it becomes
return ( x < y ? tmp_left : tmp_right );     

现在它看起来简单易懂,对吧?

答案 5 :(得分:1)

变量名之前的**data中的*是取消引用指针。

它们之间的tmp_right用于乘法。

此代码返回最小的tmp_leftreturn((tmp_left)<(tmp_right)?tmp_left:tmp_right);

它似乎在功能上与:

相同
*data

我不确定x*y < x*z指的是什么,但除非出现奇怪的事情,否则乘法实际上没有任何影响,因为y < z等同于{{1}}。

答案 6 :(得分:1)

当你看到像这样复杂的陈述时,试着简化它。首先,打破三元运算符并添加一些空格:

if(((*data) * (tmp_left) < (*data) * (tmp_right)))
{
    return tmp_left;
}
else
{
    return tmp_right;
}

下一个因素输出*数据并删除多余的parens:

data_type& d = *data;
if((d * tmp_left < d * tmp_right))
{
    return tmp_left;
}
else
{
    return tmp_right;
}

此时显而易见的是*是乘法,而且正是函数中正在发生的事情。 如果 *data总是肯定的,那么你可以将该术语完全分解,但情况可能并非如此。