源公式

num[key++] = num[key] + num[key];

解析

    这个公式如果抽象的看,就是A = B + C;的执行过程,这里B和C相等,都是num[key],那么问题就是,这个过程,究竟是先执行哪一边?
    如果说,先执行左边,那么我们初始化key = 0, num[] = {1, 2},这样子就可以转化为:
    num[0] = num[1] + num[1] = 4;
    而要是先执行右边,那么我们就可以转化为:
    (num[0] + num[0]) => num[0] = 2;

验证代码

#include<iostream>

using namespace std;

int main()
{
    int key = 0;
    int num[] = {
  1, 2};
    cout << "a = b + c的执行顺序是什么?" << endl;
    cout << "key -> " << key << endl;
    //此写法⚠️
    num[key++] = (num[key] && (cout << "key -> " << key << "B " << endl)) + (num[key] && (cout << "key -> " << key << "C " << endl));
    cout << "key -> " << key - 1 << "A " << endl;
    cout << "key -> " << key << endl;
    if (num[0] == num[1])
    {
        cout << "先执行等号右侧!" << endl;
    }
    else if (num[0] == 4)
    {
        cout << "先执行等号左侧!" << endl;
    }
}

结果

运行上述代码,我们可以得到,这个式子是先执行等号右侧,然后再赋值给等号左侧。
那么我们可以将这个式子(在我的IDE——Xcode中,这个式子是被警告的)转化为更加合理的式子:

num[key] = num[key] + num[key];
key++;

拓展

既然上述解析过程已经证明等号左右的执行顺序是先执行右侧,然后再赋值给左侧,那么右侧B和C的执行过程呢?如下式:

num[key++] = num[key++] + num[key++];

解析

根据前文我们可以肯定的是先执行右侧,然后再赋值给左侧,那么我们可以转化为如下:

num[key] = num[key++] + num[key++];
key++;
如此我们只需要验证右侧的两个key或者左侧num[key]就可以了,然而因为验证key难度高,所以我们只要验证后者就好了。

验证代码

#include<iostream>

using namespace std;

int main()
{
    int key = 0;
    int num[] = {
  1, 2, 0};
    cout << "a = b + c的执行顺序是什么?" << endl;
    num[key++] = num[key++] + num[key++];
    cout << num[2] << endl;
    return 0;
}

结果

根据我们的猜测可以知道结果只可能为0、1、2、3、4。
如果num[key]为0,则是:key++, key++, num[2] + num[2]; => num[2] = 0;
如果num[key]为1,则是:num[0] (key++, key++) + num[2]; => num[2] = 1;
如果num[key]为2,则是:num[0] + num[0], key++, key++; => num[2] = 2;
如果num[key]为3,则是:num[0] (key++) + num[1], key++; => num[2] = 3;
如果num[key]为4,则是:key++, num[1] + num[1], key++; => num[2] = 4;
经过结果检验,很明显是第四种情况。
也就是说,先执行右边,然后赋值给左边,在执行右边时是按照从左往右的顺序执行(同一优先级时),执行完一部分,自增一次,如果是不同优先级,那么理论上就是先执行优先级高的部分,然后自增。如:

A[key++] = B[key++] + C[key++] * D[key++];

初始化key为0的话,那么就可以转化为:

A[3] = B[2] + C[0] * D[1];

最终key值为4。
OVER!!!