育儿先育己
专业做父母

彻底搞懂信息学奥赛中c++自加运算符i++和++i的区别

孩子在学习信息奥赛的C++编程语言时离不开要去理解自加/减运算符,即++、–操作。其中比较难以理解的是他们的两种用法,比如i++和++i的区别。今天就来彻底搞懂这两种用法的区别。

i++和++i在单独使用时,效果是一样的!

自增和自减的两种方式,在单独使用的时候,效果是一样的,都表示加1或减1的操作。比如

#include <iostream>
using namespace std;

int main() {

int a = 10;
a++;
a++;
cout << a;

int b = 10;
++b;
++b;
cout << b;

}

a和b默认值都是10,a经过了两次a++,最终是到了12;b经过了两次++b,最终也是到了12,所以输出a和b的值是一样的,都是12。

 

i++和++i在赋值语句中使用时,才有不同!

非常重要的一点:涉及到赋值语句,一定是自右向左的操作!

赋值语句是编程中特有的一种操作,比如“b=a”,我们会读成“b等于a”(从左向右读);实际上,编程中认为的是“把a的值赋给b”(从右向左进行)。

这个时候,赋值语句“b=a++”和“b=++a”就会对b的最终赋值产生影响,对a本身 则没有影响。比如:

int a = 10, b;
b = a++;
cout << a << ” ” << b << endl;

此时,输出a的值就是11,而b的值则还是10。

主要原因是:在赋值运算中,i++或i–是先使用i,再把i的值加1或减1。而++i或–i则是先自增1或自减1之后再使用i。

int a = 10, b;
b = (a++) + (a++);
cout << a << ” ” << b << endl;

赋值表达式的第一个a++表示先用a再自增1,也就是这里参与计算的是10,使用后a增加到11;

接着是第二个a++,同样也是先用a则自增1,此时的a因为自增已经到了11,所以这里参与计算的就是11,使用后a增到12;

所以,两个a++,左边参与计算的是10,右边参与计算的11,那么b的值就是b=10+11=21。而a最终经过两次自增,变成了12。

最终输出 a是12,b是21。

 

i++是先使用再自增,++i则是先自增再使用

前面已经了解到:i++是先使用再自增。那么++i则是先自增再使用了!

int a = 10, b;
b = (++a) + (++a);
cout << a << ” ” << b << endl;

同样,看下这个赋值语句b = (++a) + (++a)

第一个的++a表示先增到11,那么此时的a能使用参与计算吗?不能!

因为赋值语句的右侧还有一个++a,必须把这个再自增一下,即增到12后,再统一使用a参与计算!(和++a的存储指针有关)

所以,两个++a其实就是先增2次(a到了12),再使用a参与计算,b=12+12=24。

最终输出 a是12,b是24。

 

会产生错误理解的赋值语句 i=i++

初学编程,一旦对赋值语句的使用不恰当就会造成对概念的误解。比如

int a = 10,;
a = a++;
cout << a << endl;

很多用户把a++的值又赋给了a,最终输出a的结果还是10,于是就是认为a++最终使得a还是没有变化。

其实,这是把a++在自增之前的10又重新赋给了a,所以输出的时候就会显示最新的a值。

 

理解下面的程序,就彻底搞懂了i++和++i的区别

在顺序结构程序中,上下文中有多个i++和++i就像计数一样,对变量i的最新值都会产生影响。

#include <iostream>
using namespace std;

int main() {
int a = 10, b;

b = a++;
cout << a << ” ” << b << endl;
//a=11,b=10;a++表示先使用a,然后加1。所以b就是10,a就是11。

b = (a++) + (a++);
cout << a << ” ” << b << endl;
//a=13;b=23;a++经过两次,从11(a在上面语句中已经自增到11)到12再到13,最终a是13;
//第一个a++是11参与使用,然后a增为12;第二个a++是12参与使用(然后自增为13),那么b=11+12=23。

b = (++a) + (++a);
cout << a << ” ” << b;
//a=15;b=30;a已经自增到13,经过两次++a后,从13到14再到15,所以a是15;
//b则是因为++a是先增长再赋值使用,所以b=15+15=30。
}

你会发现,在赋值号右侧的a,无论是a++还是++a,对其最终值的影响都没有变化;

而在赋值号左侧的b则是因为a++和++a是“先使用再自增”还是“先自增再使用”产生了区别!

赞(1)

登录

找回密码

注册