i++与++i操作符区别

对于前缀++操作符和后缀++操作符的区别一直没搞很明白,因为他们有时候用起来感觉没区别,比如在for循环中:

for(int i=0; i<10; i++){

}
for(int i=0; i<10; ++i){

}

而在另一些表达式上会产生不同的结果:

int i=0,j=0;
int a=i++;
int b=++j;

这里i与j最后的值都是1,但a的值为0,b的值为1。
在网上搜索一些文章时,大部分是这样解释的。

  • i++:i++是先赋值再自增
  • ++i:++i是先自增后赋值

简单的情况能够判断,但有时候情况稍微复杂一点就会有点迷糊了。甚至相同的代码在不同的编译器下、不同的语言下结果并不相同。

比如下面两个例子:

public static void mian(string[] arg)
{
	int i = 1;
	i = i++;
	int j = i++;
	int k = i + ++i * i++;
	System.out.println("i = " + i);
	System.out.println("j = " + j);
	System.out.println("k = " + k);
}

结果:i=4,j=1,k=11。 k = 2 + 3 * 3.

#include <stdio.h>
int main(void) { 
    int i = 1;
	i = i++;
	int j = i++;
	int k = i + ++i * i++;
	printf("i=%d,j=%d,k=%d\n",i,j,k);
	return 0;
}

结果:i=4,j=1,k=16。 k = 4 + 4 * 3
若k = i + i * i++; k = 9。 k = 3 + 3 * 2
若k = i + i++ * i; k = 9。 k = 3 + 2 * 3
若k = i + i++ * i++; k = 10。 k = 4 + 2 * 3
若k = i + i++ * ++i; k = 12。 k = 4 + 2 * 4
若k = i + ++i * ++i; k = 20。 k = 4 + 4 * 4
以上都是在同一编译器下运行的结果。

我们来分析C语言下运行这段代码的过程。先解释i = i++运行之后i的值还是为1,i++是先将i的值赋给temp,然后变量i加1,最后返回temp,temp的值是为1的将i为2的值覆盖了。j = i++毫无疑问j的值为1。再看k = i + ++i * i++,根据结果推论是先运算的i++然后再运算++i。

为何Java语言和C语言的结果会不一样?这就是下面讲的与表达式的求值顺序有关。从结果上来看,在Java语言中加法操作符的左操作数是在右操作数之前进行求值的。而上面C语言运行结果是加法操作符的左操作数是在右操作数之后进行求值的,当然这只是相对于我运行这段程序所使用的编译器来说的。

来源:《C和指针》:p83
重点:这与表达式的求值顺序有关,由于表达式的求值顺序并非完全由操作符的优先级决定,因此像下面这样的语句是很危险的。
c + --c
操作符的优先级规则要求自减运算在加法运算之前进行,但我们并没有办法得知加法操作符的左操作数是在右操作数之前还是之后进行求值。它在这个表达式中将存在区别,因为自减操作符具有副作用。–c在c之前或之后执行,表达式的结果在两种情况下将会不同。
标准规定类似这种表达式的值是未定义的。尽管每种编译器都会为这个表达式产生某个值,但到底哪个是正确的并无标准答案。因此,像这样的表达式是不可移植的,应该予以避免。

//一个证明表达式的求值顺序只是部分由操作符的优先级决定的程序
int main()
{
	int i = 10;
	i = i-- - --i * ( i = -3 ) * i++ + ++i;
	printf("i = %d\n", i);
}
编译器
-128Tandy 6000 Xenix 3.2
-95Think C 5.02(Macintosh)
-86IBM PowerPC AIX 3.2.5
-63gcc、HP_UX 9.0、Power C 2.0.0
42Microsoft C 5.1

前缀++操作符:先对变量进行加一,后再拷贝一份,对拷贝的这份进行操作,最后返回操作后的值。
后缀++操作符:先将变量拷贝一份,对变量加一,然后对拷贝的这份进行操作,最后返回操作后的值。

思考
如果cp是一个指针,如int* cp = 2;

  1. 分析++cp与cp++有何不同?
  2. 分析*++cp与*cp++有何不同?

其实说这么多,面对一些不好判断的时候都是要写代码验证一下的。。。。但最好不要写这种代码。

参考文章:
i++和++i的真正区别详解
关于i = i++的问题解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值