i++与++i的运算规则
2016-07-15 19:38
190 查看
1. 我们都知道自增运算符和自减运算符,如:i++ 和 ++i,i-- 和 i--。可能你会觉得这很简单,不就是 i+1、i-1吗?但是你真的深入的了解过吗?下面我将考考你
下面我来解答:我们这里设i的初值为2,所以num = 3 + 3 + 3 + 4 = 13。
这里我要提到非常重要的一点,关于 i++ 与++i 的区别。i++是先使用 i 的值,再进行 i+1。而++i 是先进行 i+1,再使用 i 的值。这是它们的本质区别!
2. 如果我将 num 改成 i ,你还能知道它的值吗?
最后 i 的值变成了15,你算正确了吗?下面我来分析一下,i 的自增和自减运算是相对于自身来讲的,这里也就是为什么表达式没有变,而 num 换成 i 之后,值加了2的原因。 i = 3 + 3 + 3 + 4+ 2 = 15。
3. 我们先讲一讲关于这里运算符优先级。首先自增、自减的优先级高,先进行自增和自减,然后再进行加法运算,结合方向自左至右,最后才是赋值运算。
例如:*p++ --> 由于++和*的优先级一样,不过它们的结合方向是自右向左。所有要先进行p++,然后再*p,最后p = p + 1。
*tab++ = *tmp++; 等效于*tab = *tmp; tab++; tmp++;
4. 下面如果用printf打印自增和自减运算,那结果又会变成什么样呢?
原来函数的传参是自右向左的,而printf是系统提供给我们使用的函数,虽然我们不知道它如何实现,但是我们可以使用printf。
讲到这里,我觉得再看几个例子,你才能总计出它的用法。
在第一个例子中,从最右边开始,2(3) --> i(4) --> i(5) --> 5(6) --> 6(7)。右边括号中的值是使用结束之后的值,所以最后
i = 7,即答案为6 5 7 7 2
在第二个例子中,从最右边开始,i(3) --> 3(4) --> 4(5) --> i(6) --> 6(7)。右边括号中的值是使用结束之后的值,所以最后 i = 7,即答案为6 7 4 3 7
那看到这里,你肯定又有问题了,自增、自减什么时候算作是使用结束呢?
答案是遇到逗号(,)、分号(;)、圆括号()算是使用结束了。
最后来总结一下,自增自减关键在于掌握使用结束之前的值和使用结束之后的值。另外呢,自减是自增的相反,和自增类似,这里我也不再讲述。相信通过这次学习,你也能掌握自增、自减的运算了吧!
#include <stdio.h> int main() { int num; int i = 2; num = (i++) + (++i) + (i++) + (++i); printf("num = %d\n", num); return 0; } [root@localhost 0715]# ./add_add num = 13答案是13,你算正确了吗?为什么num最后的值为13呢?
下面我来解答:我们这里设i的初值为2,所以num = 3 + 3 + 3 + 4 = 13。
这里我要提到非常重要的一点,关于 i++ 与++i 的区别。i++是先使用 i 的值,再进行 i+1。而++i 是先进行 i+1,再使用 i 的值。这是它们的本质区别!
2. 如果我将 num 改成 i ,你还能知道它的值吗?
int main() { int i = 2; i = (i++) + (++i) + (i++) + (++i); printf("i = %d\n", i); return 0; } [root@localhost 0715]# ./add_add i = 15
最后 i 的值变成了15,你算正确了吗?下面我来分析一下,i 的自增和自减运算是相对于自身来讲的,这里也就是为什么表达式没有变,而 num 换成 i 之后,值加了2的原因。 i = 3 + 3 + 3 + 4+ 2 = 15。
3. 我们先讲一讲关于这里运算符优先级。首先自增、自减的优先级高,先进行自增和自减,然后再进行加法运算,结合方向自左至右,最后才是赋值运算。
例如:*p++ --> 由于++和*的优先级一样,不过它们的结合方向是自右向左。所有要先进行p++,然后再*p,最后p = p + 1。
*tab++ = *tmp++; 等效于*tab = *tmp; tab++; tmp++;
4. 下面如果用printf打印自增和自减运算,那结果又会变成什么样呢?
#include <stdio.h> int main() { int i = 2; printf("%d %d %d %d %d\n", i++, i++, ++i, ++i, i++); return 0; } [root@localhost 0715]# ./add_add 6 5 7 7 2当我们用printf打印自增和自减运算的时候,我们发现这和我们想象中的一点都不一样。这是为什么呢?
原来函数的传参是自右向左的,而printf是系统提供给我们使用的函数,虽然我们不知道它如何实现,但是我们可以使用printf。
讲到这里,我觉得再看几个例子,你才能总计出它的用法。
#include <stdio.h> int main() { int i = 2;; printf("%d %d %d %d %d\n", i++, ++i, i++, i++, ++i); return 0; } [root@localhost 0715]# ./add_add 6 7 4 3 7可以通过这两个例子发现有几个++i ,就有几个值相等,而且它们的值最大。可以总结出一句话来:i++被替换成数值,而++i 被替换成变量名。
在第一个例子中,从最右边开始,2(3) --> i(4) --> i(5) --> 5(6) --> 6(7)。右边括号中的值是使用结束之后的值,所以最后
i = 7,即答案为6 5 7 7 2
在第二个例子中,从最右边开始,i(3) --> 3(4) --> 4(5) --> i(6) --> 6(7)。右边括号中的值是使用结束之后的值,所以最后 i = 7,即答案为6 7 4 3 7
那看到这里,你肯定又有问题了,自增、自减什么时候算作是使用结束呢?
答案是遇到逗号(,)、分号(;)、圆括号()算是使用结束了。
最后来总结一下,自增自减关键在于掌握使用结束之前的值和使用结束之后的值。另外呢,自减是自增的相反,和自增类似,这里我也不再讲述。相信通过这次学习,你也能掌握自增、自减的运算了吧!
相关文章推荐
- ITeye上“10个人,8个人不会解释这个问题”的帖子
- Oracle 自增(auto increment) 或 标识字段的建立方法
- java中的自增问题介绍
- 在MySQL中创建实现自增的序列(Sequence)的教程
- Oracle数据库中创建自增主键的实例教程
- mysql中自增auto_increment功能的相关设置及问题
- php实现Mongodb自定义方式生成自增ID的方法
- Oracle数据库中创建自增主键的实例教程
- jean同学的android编译自动修改版本号
- 数据库自增主键的问题
- 关于 C# 自增运算符(operator ++)的重载
- MySQL实现序列(Sequence)效果
- 向自增字段中插入值
- JAVA i=i++,i=i+1的误区
- Navicat 设置主键自增 自动增长 Navicat中怎么设置主键自增长?
- Redis自增实现计数
- Mysql中插入字段同时等于主键ID
- 自增和自减运算
- 设置SQL Server 2008数据库int类型主码为自增类型
- Mysql设置自增长主键的初始值