第一段代码:
创新互联主营苏尼特右网站建设的网络公司,主营网站建设方案,成都app开发,苏尼特右h5微信平台小程序开发搭建,苏尼特右网站营销推广欢迎苏尼特右等地区企业咨询
++i是先增加i的值,然后使用。
p=f(i,++i); 是先执行++i,后进行函数调用。因为执行了++i以后,i的值已经变成了3,
所以相当于p=f(3,3);
你可以在函数f里面把a和b的值打印出来,你会发现a和b都是3.
第二段代码:
i++是先使用i的值,然后把i的值加1.
所以相当于先执行p=f(2,2);
执行之后,把i的值变成3.答案应该是0.
我怀疑你们老师的课件写错了,建议你去问问他。
(1)printf("%d", i++); 后缀,表达式里用 i, 出了表达式 自增1,故,分解为: printf("%d", i); i=i+1;
(2) printf("%d", ++i); 前缀,先自增,后用于表达式,故,分解为: i=i+1; printf("%d", i);
(3)(4) 同理,printf("%d", i--); 分解为:printf("%d", i); i=i-1;
printf("%d", --i); 分解为: i=i-1; printf("%d", i);
把分解后的语句组合起来,就可看出,输出为 40 42 42 40
编译器的不同 结果可能不同~~
p(i,++i)
有的传递的参数是2,3
有的传递的参数是3,3
运算顺序从左至右和从右至左~~
如果传递的参数是2,3 那么返回值为-1 如果传递的参数是3,3 那么返回0
x=5
-----
++x 6 x=6
--x 5 x=5
x++ 5 x=6
x-- 6 x=5
-x++ -5 x=6
-x-- -6 x=5
-----
我们把它们当成函数调用的形式来看,会比较好理解。i做为参数传入,
在(++i,--i中,++,--做为前缀运算符),表达式的值为i+1或i-1.返回值为i+1或i-1.
在(i++,i--中,++,--做为后缀运算符),表达式的值为i,返回值为i+1或i-1.
看到有什么不同了吗?
在++,--做为前缀运算符式,改变表达式的值,而作为后缀运算符时,表达式值不变。
共同点是,无论做前缀或后缀,返回值都自加或自减。
---------------------
....
int x=5; // x初始化值为5
printf("%d,",++x); // x=5,打印++x的值,++x的值为x+1 (5+1=6),返回值x+1,x=6
printf("%d,",--x"); // x=6,打印--x的值,--x的值为x-1 (6-1=5),返回值x-1,x=5
printf("%d,",x++); // x=5,打印x++的值, x++的值为x (5) ,返回值x+1,x=6
printf("%d,",x--); // x=6,打印x--的值, x--的值为x (6) ,返回值x-1,x=5
printf("%d,",-x++); // x=5,打印-x++的值, x++的值为x (5) -x=-5 ,返回值x+1,x=6
printf("%d,",-x--); // x=6,打印-x--的值, x--的值为x (6) -x=-6 ,返回值x-1,x=5
【表达式的值】 【返回的值】
....
ps:表达式的值和返回的值是两个概念,-x++,-x--可看做-(x++),-(x--).++,--的优先级高于+,-
C语言中区分前自增与后自增,它们都有副作用,尤其是后自增。
前自增可能更好一点,它不产生临时变量,效率更高一些。
++y相当于:y=y+1;在变量的使用之前先自增。
y++相当于:y; 其它语句... y=y+1;也就是使用它时,它的值不变,在其使用之后的某一时刻但在再次使用它前其值加一。而且不同的编译器不一定有一致的实现行为。
a=(y++)+(y++)+(y++) 这是一条语句,通常的编译器实现会将此语句一次性扫描完成。这种情况下,y++会保持其值不变,此语句完成后,将y的值递增3次。