当前位置:   article > 正文

*p++、*(p++)、*++p、*(++p)的区别_*p++和*(p++)的区别

*p++和*(p++)的区别

首先我们看一下运算符的优先级,注意一下“*”和“++”的优先级。

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

()

圆括号

(表达式)/函数名(形参表)

.

成员选择(对象)

对象.成员名

->

成员选择(指针)

对象指针->成员名

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式/整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

双目运算符

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

/=

除后赋值

变量/=表达式

*=

乘后赋值

变量*=表达式

%=

取模后赋值

变量%=表达式

+=

加后赋值

变量+=表达式

-=

减后赋值

变量-=表达式

<<=

左移后赋值

变量<<=表达式

>>=

右移后赋值

变量>>=表达式

&=

按位与后赋值

变量&=表达式

^=

按位异或后赋值

变量^=表达式

|=

按位或后赋值

变量|=表达式

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算

1、*p++ 与 *(p++)的区别

因为“++”的优先级大于“*”,所以*p++ 相当于*(p++)。(删掉的内容是之前错误的表述。)

从上面的表格可以看出,“++”与“*”这两个运算符的优先级是一样的,当出现在同一个表达式中时,按照由右向左的结合方式。你可以理解为这是一种语法规定,没什么深层的含义。

因此*p++和*(p++)其实是一样的,只不过后者使用小括号而更具有可读性。

p++表示先运算再++,所以*p++或者*(p++),其实等价于“先(*p),然后再p++”。

注意,“先(*p),然后再p++”不能表示成“ (*p)++”,因为(*p)表示常量,不存在“常量++”的表示方法。(*p)++这种表示方式是错误的。

当指针p指向一个字符串常量时,“先(*p),然后再p++”不能表示成“ (*p)++”,因为(*p)表示常量,只能读取而不能修改。

2、*++p 与 *(++p)的区别

由于“++”的优先级大于“*”,所以两者的含义是一样的。(删掉的内容是之前错误的表述。)

这两者其实也是一样的,都表示“ 先p++(即把p指针移动至下一个位置),然后再*(表示索取p指针移动之后所指向的值)”。

3、代码示例

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main(void)
  4. {
  5. char *p = "abcdef";
  6. char c;
  7. //分别运行
  8. /*
  9. c = *p++;
  10. printf("%c\n", c);//a
  11. printf("%c\n",*p);//b
  12. */
  13. c = *(p++);
  14. printf("%c\n", c);//a
  15. printf("%c\n",*p);//b
  16. /*
  17. //这种写法是错误的,换句话说,(*p)是一个常量,没有“常量++”的写法
  18. c = (*p)++;
  19. printf("%c\n", c);
  20. printf("%c\n",*p);
  21. */
  22. /*
  23. c = *++p;
  24. printf("%c\n", c);//b
  25. printf("%c\n", *p);//b
  26. */
  27. /*
  28. c = *(++p);
  29. printf("%c\n", c);//b
  30. printf("%c\n", *p);//b
  31. */
  32. /*
  33. //这种写法是错误的,没有这种写法。
  34. c = ++(*p);//c = ++*p;也是错误的。
  35. printf("%c\n", c);//b
  36. printf("%c\n", *p);//b
  37. */
  38. getchar();
  39. return 0;
  40. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/79735
推荐阅读
相关标签
  

闽ICP备14008679号