优先级别:++、--、-、------>乘/除法------->+/-
作用是使变量的值增1或减1.
++i,--i 在使用i之前,先使i的值加(减1)
i++,i-- 在使用i之后,使i的值加(减1)
注意:1.自增运算符只能用于变量,而不能用于常量或表达式。
2.自右向左进行编译,值的结果自右向左输出。
简单举例:
1.main() 2.main() 3.main() 4.main()
{ { { {
int a=3; int a=3; int a=3; int a=3;
printf("%d,%d",a,++a); printf("%d,%d",++a,a); printf("%d,%d",a,a++); printf("%d,%d",a++,a);
} } } }
输出结果:4,4 输出结果:4,3 输出结果:4,3 输出结果:3,3
动手练习下喽:
1.main() 2.main()
{ {
int a=3; int a=3;
printf("%d,%d,%d",a,a++,++a); printf("%d,%d,%d",a++,++a,a);
} }
输出结果:5,4,5 输出结果:4,5,5
5(6)4(5)a(4)
这两个结果让我有点纠结。5555
1.main() 2.main()
{ int a=3; { int a=3,b;
printf("%d",(a++)+(a++)+(a++)); b=(a++)+(a++)+(a++);
} printf'("%d",b);
}
输出结果:12(5+4+3) 输出结果:9(3+3+3)
第一个例子,a的值并没有赋予任何一个变量,所以对于它自身所做的自增自减运算来说,它的值是不断变化的。
第二个例子,a的值被赋予了b,这就要求a必须是一个固定的值,也就意味着a的值是静止的。
又来一波练习!
1.main() 2.main 3.main()
{ int a=3; {int a=3,b; { int a=3,b;
printf("%d",(++a)+(++a)+(++a)); b=(++a)+(++a)+(++a); b=(++a)+(++a)+(a++)
} printf("%d",b); printf("%d",b);
输出结果:16(5+5+6) }输出结果:16(5+5+6) }输出结果:15(5+5+5)
总结:前两个先进行运算,再与最后一个进行运算
最令人吐血的!
1.main() 2.main()
{ int a=3; { int a=3;
a=(a++)+(++a)+(a++); printf("%d",(a++)+(++a)+(a++));
printf("%d",a); }
}输出结果:14() 输出结果:13(5+5+3)
1.赋值对象是它本身,自右向左,两次a++,a=5
2.自右向左依次运算
意外滴!
1.int i=3; 2.int i=3;
int j=4; int j=4;
int a=i++ + i++; int a=i++ + i++ + i++;
int b=++j + ++j; int b=++j + ++j + ++j;
printf("%d,%d\n",a,b); printf("%d,%d\n",a,b);
输出结果:6,12 输出结果:9,19(6+6+7)
1111i++是执行完整个表达式的其他操作后,然后自增,a=3+3=6,而后,i自增两次,i=5
1111++i是先自增然后再参与其他运算,b=6+6=12
2222因为存在两个同级的+运算,根据+运算符的左结合性,在编译时,首先处理(++j + ++j)这部分,再将此结果和++j相加。
总结:计算结果被赋予一个新变量,前两个先结合。未被赋予新的变量,自右向左逐步计算。
我又晕啦!!!啊啊啊啊!!!
int i=2;
printf("%d %d %d %d %d\n",i++,i++,++i,++i,i++);
输出结果:6 5 7 7 2
从最右边开始:2(3)--i(4)--i(5)--5(6)--6(7)
i=2;
printf("%d %d %d %d %d\n",i++,++i,i++,i++,++i);
输出结果:6 7 4 3 7
从最右边开始:i(3)--3(4)--4(5)--i(6)--6(7)
通过例子,我们可以发现,有几个++i,就有几个值相等,而且它们的值最大。i++被替换成数值,++i被替换成变量名。
使用printf函数打印自增自减运算时,发现函数的传参是自右向左的。