我有一个关于指针概念的问题,我找不到
的合理答案#include<conio.h>
#include<iostream.h>
void main()
{
int arr[10];
clrscr();
cout<<*arr+5 - *arr+3;
getch();
}
即使我指定arr [0] = 10; (或任何其他价值)
编译器给出答案8但是如何。我无法看到(理解)运算符优先级和关联性如何解决它。
我将感激你。
答案 0 :(得分:4)
由于*arr
- *arr
为0
而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,如果有两个,那么它就成倍增加。