C语言i++和++i的区别和指针*(a++)和*(++a)的区别

i++  :先引用后增加
++i :先增加后引用
i++ :先在i所在的表达式中使用i的当前值,后让i加1

++i :让i先加1,然后在i所在的表达式中使用i的新值

一、c语言中i++和++i的运行效果是不一样的,下面的都是摘自网上各地方的资料:

1.后置运算:k++表示先运算,后自加。 
意思是遇到k++了,我先把当前的k的值拿来参加运算,后面再去管它的自加。 
那么,【“后面”后到什么程度呢?要后到当前的语句执行完,即遇到分号;表示 
语句执行完了,所以k才自加1。】 

如:int k=5,b=0;
b=k++;的意思就是,先算b=k(即b=5),遇到分号;表示语句结束,k才自加1,即k变为6。

2.前置运算:++k表示先自加,后运算 
这个意思就是遇到++k了,先把k的值加了1,再往后执行别的。 

如:int k=5,b=0;
b=++k;的意思就是,先把k自加1,即k为6,再算b=k(即b=6)。

掌握好这两点,k--和--k也是一样的道理。

二、下面介绍一下*(p++)和*(++p)的区别

 

首先我们得清楚C语言运算符优先级和结合方向:

优先级:C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。 而在一个运算量两侧的运算符优先级相同时, 则按运算符的结合性所规定的结合方向处理。

集合方向:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合, 执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。

下面是优先级表和方向:

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

--

()

圆括号

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

--

.

成员选择(对象)

对象.成员名

--

->

成员选择(指针)

对象指针->成员名

--

 

2

-

负号运算符

-表达式

右到左

单目运算符

~

按位取反运算符

~表达式

++

自增运算符

++变量名/变量名++

--

自减运算符

--变量名/变量名--

*

取值运算符

*指针变量

&

取地址运算符

&变量名

!

逻辑非运算符

!表达式

(类型)

强制类型转换

(数据类型)表达式

--

sizeof

长度运算符

sizeof(表达式)

--

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

%

余数(取模)

整型表达式%整型表达式

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

 

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

小于

表达式<表达式

<=

小于等于

表达式<=表达式

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

 

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

 

13

?:

条件运算符

表达式1?

表达式2: 表达式3

右到左

三目运算符

 

14

=

赋值运算符

变量=表达式

右到左

--

/=

除后赋值

变量/=表达式

--

*=

乘后赋值

变量*=表达式

--

%=

取模后赋值

变量%=表达式

--

+=

加后赋值

变量+=表达式

--

-=

减后赋值

变量-=表达式

--

<<=

左移后赋值

变量<<=表达式

--

>>=

右移后赋值

变量>>=表达式

--

&=

按位与后赋值

变量&=表达式

--

^=

按位异或后赋值

变量^=表达式

--

|=

按位或后赋值

变量|=表达式

--

 

15

逗号运算符

表达式,表达式,…

左到右

--

因此比如比如*p指向一个数组a的指针:

1、b=*(p++)中p++是后置运算因此只有执行完了这句后p的值才加1,因此其实就是b=*p;p=p+1的省写。

2、b=*(++p)中是前置。因此先p的值加1,再进行指针计算。就是p=p+1;b=*p的缩写。

posted @ 2017-10-23 21:43  专注it  阅读(1039)  评论(0编辑  收藏  举报