【Linux C】自增运算知多少

  在C语言中,有很多运算符,有一种运算符叫做算术运算符,用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、取余(%),自增(++)、自减(--)。

 

  今天我们来详细地介绍一下关于自增的一些小运算。


  以i为例,我们知道自增运算有两种,“i++;”和“++i;”那么这两种运算的区别在哪呢?

  i++; 相当于先计算“i = i;”再计算"i = i + 1;"即先使用i,使用完毕之后,再执行++操作,在这里,使用完毕就是遇到结束标志的意思。

  ++i; 相当于先计算“i = i + 1;”再计算“ i = i;”即先自加,再使用i。

 

  下面我们练一道题。

#include 

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】自增运算知多少_第1张图片

  在这里,我们以介绍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 

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 

int main()
{
    int i = 2;

    i = i * ((i++) + (++i));
    
    printf("i = %d\n",i);
    
    return 0;
}

答案

i = 19
 
  

2.

#include 

int main()
{
    int i = 2;

    i = (i++) + (++i) + (i++) + (++i);
    
    printf("i = %d\n",i);
    
    return 0;
}


答案

i = 15


3.
#include 

int main()
{
    int i = 2;

    i = (++i) + (i++) + (++i) + (i++);
    
    printf("i = %d\n",i);
    
    return 0;
}

答案
i = 16


  接下来,我们来看一下这个函数结果为多少?

#include 

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 

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 

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 

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 

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 

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

  现在应该能够准确地计算出关于自增运算的结果了吧。


你可能感兴趣的:(Linux,C/C++)