C ++指针。我想知道逻辑

时间:2014-06-24 13:18:07

标签: c++ pointers

我有一个关于指针概念的问题,我找不到

的合理答案
#include<conio.h>
#include<iostream.h>
void main()
{
    int arr[10];
    clrscr();
    cout<<*arr+5 - *arr+3;
    getch();
}

即使我指定arr [0] = 10; (或任何其他价值)

编译器给出答案8但是如何。我无法看到(理解)运算符优先级和关联性如何解决它。

我将感激你。

3 个答案:

答案 0 :(得分:4)

由于*arr - *arr0而5 + 3为8。

您可能期望的结果是:

cout<<(*arr+5) - (*arr+3);

答案 1 :(得分:4)

编译器给出答案8,因为该操作仅等效于:(* arr - * arr)+ 5 + 3 = 8.如果要将标量添加到指针然后获取引用的值,则必须使用括号*(arr + 5)。

答案 2 :(得分:1)

如果查看优先级表,例如:

http://en.cppreference.com/w/cpp/language/operator_precedence

然后您会注意到解除引用运算符(*)的优先级高于加/减(+/-)运算符(它们分别位于第3和第6组)。这就是为什么执行的第一个操作是获取 arr 变量指向的值,即此部分:

*arr

此后,执行加法/减法。 arr 指向的值无关紧要,因为无论如何它都会被减少。

这是你应该阅读这个表达式的方法:

(*arr) + 5 - (*arr) + 3

(* arr) - (* arr)为0,无论它指向什么值。

编辑:我上面写的内容在您的案例和编译器中显然是正确的,但请查看@Konrad Rudolph对此答案的评论。

而且,如果你很好奇,编译器如何知道,例如,'*'是否应该被视为乘法或解引用运算符:它通过查看参数的数量来解决这个问题 - 如果只有一个,那么它是derefence,如果有两个,那么它就成倍增加。