首先大家可以先想一想下面这个程序的输出结果
#include<iostream>
using namespace std;
int main()
{
int i=0;
int s = ++i + ++i + ++i;
cout<<"s="<<s<<endl;
return 0;
}
计算方式1(大多数人的想法)
一个一个算
思路:
- s = ++i + ++i + ++i , i=0
- s = 1 + ++i + ++i , i=1
- s = 1 + 2 + ++i , i=2
- s = 1 + 2 + 3 , i=3
输出:s=6
计算方式2(Dev-Cpp)
两个两个算
思路:
- s = ++i + ++i + ++i , i=0
- s = (++i + ++i )+ ++i , i=0
- s = ( i + ++i )+ ++i , i=1
- s =( i + i ) + ++i , i=2
- s =( 2 + 2 ) + ++i , i=2
- s = 4 + ++i , i=2
- s = 4 + i ,i=3
- s = 4 + 3 , i=3
输出:
s=7
计算方式3(VS2017)
先算完全部++,再相加
思路:
- s = ++i + ++i + ++i , i=0
- s = i + ++i + ++i , i=1
- s = i + i + ++i , i=2
- s = i + i + i , i=3
- s= 3 + 3 + 3 , i=3
输出:
s=9
不知道大家有没有看懂我的描述,我再举个例子吧
大家可以尝试用上面3种计算方式来预测一下输出哦
#include<iostream>
using namespace std;
int main()
{
int i=0;
int n = (++i + ++i) + (++i+ ++i)+(++i + ++i);
cout<<"n="<<n<<endl;
i=0;
int m=++i+ ++i+ ++i+ ++i+ ++i+ ++i;
cout<<"m="<<m<<endl;
i=0;
return 0;
}
计算方式1
一个一个算
思路:
- n = ( 1 + 2 ) + ( 3+ 4 ) + ( 5 + 6 )
- m= 1 + 2 + 3 + 4 + 5 + 6
输出:
n=21
m=21
计算方式2
两个两个算
思路:
- n = ( i + i ) + (++i+ ++i)+(++i + ++i) , i=2
- n = ( 2+2 ) + (++i+ ++i)+(++i + ++i) , i=2
- n = ( 2+2 ) + ( i + i )+(++i + ++i) , i=4
- n = ( 2+2 ) + ( 4 + 4 )+(++i + ++i) , i=4
- n = ( 2+2 ) + ( 4 + 4 )+( 6 + 6 ) , i=6
- n = 4 + 8 + 12
- m = ( i+ i ) + ++i+ ++i+ ++i+ ++i, i=2
- m = (2+2) + ++i+ ++i+ ++i+ ++i, i=2
- m =( 4 + ++i)+ ++i+ ++i+ ++i, i=2
- m =( 4 + i )+ ++i+ ++i+ ++i, i=3
- m =( 4 + 3 )+ ++i+ ++i+ ++i, i=3
- m =( 7 + ++i )+ ++i+ ++i , i=3
- m =( 7 + 4 )+ ++i+ ++i , i=4
- m =( 11 + 5 )+ ++i , i=5
- m = 16 + 6 , i=6
输出:
n=24
m=22
计算方式3(VS2017)
先算完全部++,再相加
思路:
- n = ( i + i )+( i + i )+( i + i ) , i=6
- n = ( 6+6 )+(6+ 6)+( 6 +6 ) , i=6
- m= i + i + i + i + i + i , i=6
- m= 6 + 6 + 6 + 6 + 6 + 6
对于数组下标来说,Dev-Cpp使用的是计算方式1,VS2017依旧使用计算方式3
#include<iostream>
using namespace std;
int main()
{
int i = 0;
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
int s = a[++i] + a[++i] + a[++i] + a[++i] + a[++i] + a[++i];
cout << "s=" << s << endl;
return 0;
}
Dev-Cpp
VS2017
同一个式子竟然有多个答案,那么到底哪种算法才是对的呢?
事实上以上3种算法都是对的,不同的编译器有不同的算法,所以保险起见一般不建议在一条语句里面连续进行自增自减运算。
以下为废话,不用看
事情起因:
今天是2021.1.30,昨晚我在用《啊哈算法》第四章第一节里面的深度优先搜索的方法去敲的第三章第一节:坑爹的奥数 的代码的时候输出就用了连续自增(就是上面提到的数组下标自增),然后一直得不到我想要的结果,还以为是自己代码写错了,调试了半天结果发现居然是我和编译器的算法不同……呜呜呜呜浪费我时间
我发誓
再用连续自增我就是猪🐖