在C语言中,有很多运算符,有一种运算符叫做算术运算符,用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、取余(%),自增(++)、自减(--)。
今天我们来详细地介绍一下关于自增的一些小运算。
以i为例,我们知道自增运算有两种,“i++;”和“++i;”那么这两种运算的区别在哪呢?
i++; 相当于先计算“i = i;”再计算"i = i + 1;"即先使用i,使用完毕之后,再执行++操作,在这里,使用完毕就是遇到结束标志的意思。
++i; 相当于先计算“i = i + 1;”再计算“ i = i;”即先自加,再使用i。
下面我们练一道题。
#include <stdio.h>
int main()
{
int i = 2;
int num;
num = (i++) + (i++) + (i++) + (i++);
printf("num = %d\t i = %d\n",num,i);
return 0;
}
在大家看来,这道题的输出为多少呢?
在这里需要强调一下,对于这种情况,C语言标准并没有作出规定,所以我们所使用的编译器不一样,最终输出的结果也不一样。
在Linux C中,最后的输出结果为
而在另一款编译器(如DEV C++)中,结果如下:
在这里,我们以介绍Linux C所使用的编译器为主,以下均为Linux C。
那么我们就来看一下为什么结果会是“num = 8 i = 6”。
在前面我们提到过,“i++;”是先使用i,使用完毕之后,再执行++操作,在这里,使用完毕就是遇到结束标志的意思。那么结束标志是什么呢?
结束标志有三种:
①分号“;”
②逗号“,”
③函数的括号
那么在这里,我们先使用了第一个括号里的i,这时i = 2,但是在使用完之后,我们并没有看到结束标志,所以不进行自加计算,而是进行下一个括号里的内容计算,这时i = 2,使用i,在使用了i之后,同样没有看到结束标志,也不进行自加操作,以此类推,最终num = 2 + 2 + 2 + 2 = 8,在括号里的内容全部计算完之后,看到了分号“;”,即结束标志,这时便要进行自加操作,在这里要进行四次自加操作,所以最后i = 6。
接下来我们再练习一道题。
#include <stdio.h>
int main()
{
int i = 2;
int num;
num = (++i) + (++i) + (++i) + (++i);
printf("num = %d\t i = %d\n",num,i);
return 0;
}
结果是:
num = 19 i = 6
我们来看一下为什么结果是这样的。
首先我们先来看一个例子,如:(5 + 4) + (7 + 3),对于这个式子,我们应该怎么计算呢?想必大家都知道,我们应该先计算第一个括号里的内容,即5 + 4 = 9,再计算第二个括号里的内容,即7 + 3 = 10,最后把两个数字相加,即9 + 10 = 19,也就是说,两个操作数才可以形成一个运算,这样结果就出来了。那么这在我们自增计算里面是一样的,同样也是两个操作数形成一个运算。
首先我们计算第一个括号里的++i,这时i = 3,再计算第二个括号里的,此时i = 4,然后计算两个括号中间的“+”号,但此时i = 4,即4 + 4 = 8,以此类推,num = 4 + 4 + 5 + 6 = 19,很容易得到i = 6。
下面我们多练习几道题,帮助大家充分理解计算过程。
1.
#include <stdio.h>
int main()
{
int i = 2;
i = i * ((i++) + (++i));
printf("i = %d\n",i);
return 0;
}
答案
i = 19
2.
#include <stdio.h>
int main()
{
int i = 2;
i = (i++) + (++i) + (i++) + (++i);
printf("i = %d\n",i);
return 0;
}
答案
i = 15
3.
#include <stdio.h>
int main()
{
int i = 2;
i = (++i) + (i++) + (++i) + (i++);
printf("i = %d\n",i);
return 0;
}
答案
i = 16
接下来,我们来看一下这个函数结果为多少?
#include <stdio.h>
int func(int a,int b)
{
printf("a = %d , b = %d\n",a,b);
}
int main()
{
int i = 2;
func(i++,++i);
return 0;
}
答案为
a = 3 , b = 4
为什么结果会是这样呢?
在这里,需要我们知道的一点是:函数从右边开始传参。并且在上面我们也提到过,“;”,“,”,“函数的括号”都是结束标志。
那么在这里我们总结一下,对于这类计算,我们只需要用一句话归纳总结:“++i;”被替换成变量名,“i++;”被替换成数值,i不变(还是变量名)。
我们来根据上述函数来解释一下这句话的意思,由于函数从右边开始传参,那么先看右边的形参,为++i,此时我们用i来代替,即fun(i++,i),并且此时i = 3,再看左边的形参,为i++,即用数值代替,即(3,i),然后我们遇到了函数的括号,于是进行自加,即此时i = 4,然后用数值替代变量名,即(3,4)。于是最终a = 3 , b = 4。
我们来稍微修改一下函数的内容,然后根据总结归纳来分析一下结果是多少。
1.
#include <stdio.h>
int func(int a,int b)
{
printf("a = %d , b = %d\n",a,b);
}
int main()
{
int i = 2;
func(i++,i++);
return 0;
}
答案
a = 3 , b = 2
2.
#include <stdio.h>
int func(int a,int b)
{
printf("a = %d , b = %d\n",a,b);
}
int main()
{
int i = 2;
func(++i,++i);
return 0;
}
答案
a = 4 , b = 4
3.
#include <stdio.h>
int func(int a,int b)
{
printf("a = %d , b = %d\n",a,b);
}
int main()
{
int i = 2;
func(++i,i++);
return 0;
}
答案
a = 4 , b = 2
4.
#include <stdio.h>
int func(int a,int b,int c,int d,int e)
{
printf("a = %d , b = %d , c = %d , d = %d , e = %d\n",a,b,c,d,e);
}
int main()
{
int i = 2;
func(i,i++,i++,++i,i++);
return 0;
}
答案
a = 6 , b = 5 , c = 4 , d = 6 , e = 2
5.
#include <stdio.h>
int func(int a,int b,int c,int d,int e)
{
printf("a = %d , b = %d , c = %d , d = %d , e = %d\n",a,b,c,d,e);
}
int main()
{
int i = 2;
func(i++,++i,i,i++,++i);
return 0;
}
答案
a = 5 , b = 6 , c = 6 , d = 3 , e = 6
现在应该能够准确地计算出关于自增运算的结果了吧。