为什么* ptr ++没有改变指针对象的值,但是(* ptr)++呢?

时间:2014-05-19 15:43:45

标签: c++ pointers

我正在编写这个程序

   int x = 10;
   int *yptr;
   yptr = &x;
   cout << "The address yptr points to = " << yptr;
   cout << "The contents yptr points to =" << *yptr ;
   (*yptr)++ ;  
   cout << "After increment, the contents are: " << *yptr;
   cout << "The value of x is = " << x ;

x的值从10增加到11。 但是当我写作

 *yptr ++ ;  

价值没有增加,为什么?

3 个答案:

答案 0 :(得分:4)

当你写(*yptr)++时,首先(*yptr)被提取,因为()的优先级高于++10然后是++运算符已应用,生成11。当您编写*y ++;时,首先y++被评估为++具有更高的优先级。这意味着地址增加,然后为*运算符提取内容,而不是增加内容。了解operator precedence

答案 1 :(得分:4)

在C ++语言中,运算符与其操作数之间的分组由语法定义。为方便起见,此分组通常以简化的线性形式表示,称为运算符优先级。在C ++中,后缀运算符的优先级高于前缀/一元运算符。因此,在您的情况下*yptr++代表*(yptr++),因为postfix ++的优先级高于一元*++运算符直接应用于yptr*应用于yptr++的结果。

当您添加额外的()时,您完全更改了表达式并重新对运算符和操作数进行了分组。在(*yptr)++中,您强制将*yptr相关联。现在,*运算符直接应用于yptr++应用于*yptr的结果。因此,行为的改变。

换句话说,你的回答是什么?&#34;为什么?&#34;问题是:因为你明确要求编译器进行那种改变。原始表达式相当于*(yptr++),您将其更改为(*yptr)++。这是完全不同的两种完全不同的表达方式。

P.S。请注意,C ++语言的排序规则通常不允许人们在所评估的内容中描述内置运算符的行为&#34; first&#34;并希望被评估&#34; next&#34;。很容易将这些表达式的行为描述为&#34; ++首先工作,*下一步工作&#34;但是在一般情况下这种描述是不正确的,只会导致进一步的混淆在路上。

答案 2 :(得分:0)

(*ptr)++增加保存到ptr的值。 像这样

int *ptr;
*ptr =1;
(*ptr)++; 
std::cout<< *ptr; //out put will be 2

BUT
*ptr++增加通常用于char指针变量的地址。 像这样

char *ptr = "Hello";
while(*ptr++)
     std::cout<<*ptr; //out put will be ello