【C++语言】彻底搞懂++i和i++
目录
2 前缀递增示例
2.1 示例代码
2.2 解题思路
3 后缀递增示例
3.1 示例代码
3.2 解题思路
4 混合表达式示例
4.1 示例代码
4.2 解题思路
1 概念
++是单目运算符:++i是前缀递增,先参与表达式运算,然后再自增;i++是后缀递增,表示先进行递增,然后再参与表达式运算。
2 前缀递增示例
2.1 示例代码
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int a = 10;
int b = 0;
b = a++;
cout << "b = " << b << endl;
cout << "a = " << a << endl;
system("pause");
return 0;
}
2.2 解题思路
解题过程中,为了方便理解,分别用两个盒子来表示变量a和变量b;
第一步:初始时,a的值为10,b的值为0
第二步:b = a++; 此时的a++为后缀递增,因此a++先参与表达式的运算,也就是把a的值赋给b,此时b的值也就是10;
第三步:然后再进行自增运算a = a + 1 = 10 + 1 = 11;
第四步:
输出结果:
b = 10
a = 11
3 后缀递增示例
3.1 示例代码
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int a = 10;
int b = 0;
b = ++a;
cout << "b = " << b << endl;
cout << "a = " << a << endl;
system("pause");
return 0;
}
3.2 解题思路
解题过程中,为了方便理解,分别用两个盒子来表示变量a和变量b;
第一步:初始时,a的值为10,b的值为0
第二步:b = ++a; 此时的++a为前缀递增,因此++a先进行自增,a = a + 1 = 10 + 1 = 11
第三步:然后再把a的值赋给b
第四步:
输出结果:
b = 10
a = 11
4 混合表达式示例
4.1 示例代码
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int a = 10;
int b = 5;
int c = 0;
c = a++ + b++ + ++a + ++a + ++b;
cout << "b = " << b << endl;
cout << "a = " << a << endl;
cout << "c = " << c << endl;
system("pause");
return 0;
}
4.2 解题思路
解题过程中,为了方便理解,分别用三个盒子来表示变量a,变量b和变量c;
第一步:初始时,a的值为10,b的值为5,c的值为0
第二步:c = a++ + b++ + ++a + ++a + ++b; 表达式中有三个操作符++操作符,+操作符和=操作符。其中,++操作符优先级最高,其次+操作符,最后是=操作符。
再根据同等优先级的操作数,自左向右运算的规则,一步一步拆解表达式。先计算优先级高的++操作符:
(1)先计算最左边的a++
由于是后缀递增,先参加表达式计算,再进行自增;表达式拆解为:
c = a + b++ + ++a + ++a + ++b;
a = a + 1;
此时a,b,c盒子的值保持不变。
(2)再计算b++
由于是后缀递增,先参加表达式计算,再进行自增;表达式拆解为:
c = a + b + ++a + ++a + ++b;
a = a + 1;
b = b + 1;
此时a,b,c盒子的值保持不变。
(3) 计算接下来的++a
由于是前缀递增,先进行自增,a = a + 1 = 10 + 1 = 11,再参与表达式计算。此时a盒子的值发生了变化
表达式变为:
c = a + b + a + ++a + ++b;
a = a + 1;
b = b + 1;
(4)计算接下来的++a
由于是前缀递增,先进行自增,a = a + 1 = 11 + 1 = 12,再参与表达式计算。此时a盒子的值发生了变化
表达式变为:
c = a + b + a + a + ++b;
a = a + 1;
b = b + 1;
(5)计算后一个++b
由于是前缀递增,先进行自增,b = b + 1 = 5 + 1 = 6,再参与表达式计算。此时b盒子的值发生了变化
表达式变为:
c = a + b + a + a + b;
a = a + 1;
b = b + 1;
第三步:接下来计算+操作符,此时a的值为12,b的值为6,则a + b + a + a + b = 12 + 6 + 12 + 12 + 6 = 48;
表达式变为:
c = 48;
a = a + 1;
b = b + 1;
第四步:最后进行优先级最低的=操作符运算。将48赋值给c
此时表达式剩下:
a = a + 1;
b = b + 1;
第五步:执行a = a + 1的自增运算,a = 12 + 1 = 13;
第六步:执行b = b + 1的自增运算,b = 6 + 1 = 7
第七步:
输出结果:
b = 7
a = 13
c = 48
Dugan.D.C: 要不要看看自己写了啥? 前后矛盾还是我语文不好?这为啥是百度前几的文章?诲人不倦嘛 1 概念中 "i++是后缀递增,表示先进行递增,然后再参与表达式运算。" 2.2中 "此时的a++为后缀递增,因此a++先参与表达式的运算,也就是把a的值赋给b,此时b的值也就是10;"
八羊开泰: 成功解决问题,谢谢
Jessie花木兰: 应该是错了 应该是11 11
秋风吹散马蹄声: 运行这段代码有报错。timeSetEvent函数第三个参数报错: "void (__stdcall *)(UINT uID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)" 类型的实参与 "LPTIMECALLBACK" 类型的形参不兼容
炼丹小白师: 3.2结果是不是错了