自增和自减运算符
在C语言中有许多运算符,逻辑运算,赋值运算,关系运算……,其中最难理解的莫过于自增(++)和自减(--)运算了。
自增(自减)有两种方式,下面分别进行分析。
1、++(--)在前。++i(--i)其用法是在整个表达式运算之前先进行自增(自减)运算,然后再进行表达式运算。例如进行如下计算:
intx ,y;
x= 8;
y= ++x;
运行结果为 :x = 9 ,y = 9 。x在给y赋值之前,先进行了自增运算x =x +1 = 9 ,然后将x的值赋给y , y = x =9,所以y = 9 。
2、++(--)在后。i++(i--)其用法是在整个表达式运算结束以后再进行自增或自减运算,例如进行如下运算:
intx ,y;
x= 8;
y= ++;
运行结果为:x = 9 ,y = 8 。x先给y赋值,y = x = 8 ,然后再进行自增运算x = x + 1 = 9 。所以y = 8 , x = 9 。
下面来进行稍微复杂的运算。
intx , y , z ;
x= 8 ;
y= (++x) + (x++) + (++x); Ⅰ
z= (--x) + (x--) + (++x); Ⅱ
其运行结果为:x = 10 ,y = 30 ,z =33 。
我们逐步进行分析。首先x赋值为8,x = 8 。然后看Ⅰ步:++x →x = x +1 = 9 → x++ → x = x = 9 → ++x → x = x + 1 = 9+1 = 10 。所以在计算y 之前,x 的值是 10 。y = x + x + x = 10+10+10 = 30 → x++ →x = x + 1= 11 。所以Ⅰ计算结果为y = 30 ,x = 11 。
再看Ⅱ步:--x → x = x -1 =11-1 =10 → x-- → x = x =10 → ++x → x= x + 1 = 11 。所以在计算z之前。x 的值是11 。z = x + x + x = 11 +11 +11 = 33 → x-- → x = x – 1 =10 。所以Ⅱ的结果为 z = 33 ,x = 10 。
通过以上计算我们可以看出自增和自减的用法以及++(--)在前和在后的区别。但是以上结果均是在Windows系统下编译计算出的,在Linux系统下编译出的结果会不会也是这样呢?对此,我们在Red Hat 32位Linux系统下输入相同的代码(只给出部分语句,其余均省略):
int x , y , z ;
x= 8 ;
y= (++x) + (x++) + (++x); Ⅰ
z= (--x) + (x--) + (++x); Ⅱ
通过编译我们发现,结果为 :x = 10 ,y = 28 ,z = 31 。
其结果与Windows的不同,对此,我们作如下分析:
Ⅰ ++x → x = 9 → x++ → x = 9下面一步与Windows系统不同,Linux系统先进行了加法计算,即y = x + x = 9 + 9 =18 。→ ++x →x = 10 → y =18 + x = 18 + 10 =28 → x++ → x = 11 。所以Ⅰ结果为:x = 11 ,y = 28 。
Ⅱ --x→ x =10 → x-- →x = 10,同样Linux先进行加法运算z = x + x =10 +10 = 20 。→ ++x → x = 11 → z = 20 + 11 = 31 → x-- → x = 10 。所以最终结果为 :x = 10 ,z = 31 。
通过比较我们发现,自增和自减运算的通常法一般只适用于Windows系统,对于Linux系统,自增和自减运算在某些情况下并不遵循一般规则。不知道这种情况是系统的BUG,还是其内部的算法,这有待于继续研究。