C ++通过引用传递而不改变值

时间:2017-12-12 23:45:27

标签: c++ pass-by-reference

以下是用于分析Tic-Tac-Toe板的功能的第一部分。

如果玩家“即将获胜”,aboutToWin()函数返回true,即连续两次。棋盘表示如果玩家1在该方格中移动,则3x3矩阵中的值将为1.玩家2将为-1。如果没有人采取行动,则为0。

我在这个问题中提出的部分是第一部分,它检查负对角线(即板上的位置1,5和9)。

bool aboutToWin(int squares[3][3], int& position, bool p1)
{
    // The value you are looking for is 2 for p1 and -2 for p2
    int check = 2;
    if (!p1)
    {
        check = -2;
    }

    // Check negative diagonal
    int sum = 0;
    // Go through negative diagonal
    for (int i = 0; i < 3; i++)
    {
        sum += squares[i][i];
        // Saves the position of the last checked 0 square
        // If check passes, this will be the winning square
        // If not, it will get handled and overwritten
        if (squares[i][i] == 0)
        {
            // Calculates position from i
            position = 1 + (4 * i);
            std::cout << "\nPosition: " << position << "\n";
        }
    }

    // If this diagonal added to check, stop the function and return now
    if (sum == check)
        return true;

    ...
}

这是我从main()函数运行的代码,用于测试此功能:

int p;
std::cout << p;

int a3[3][3] = {{1, 0, 1},
                {0, 0, 0},
                {0, 0, 1}}; 

std::cout << "\nShould be 1, 5: " << aboutToWin(a3, p, true) << ", " << p;

输出如下:

0
Position: 5

Should be true, 5: 1, 0

这是为什么?我可以看到该值在函数期间发生了变化,但它没有转移出函数。

1 个答案:

答案 0 :(得分:4)

使用问题:

std::cout << "\nShould be 1, 5: " << aboutToWin(a3, p, true) << ", " << p;

除非使用C ++ 17,否则不会定义参数的评估顺序。

在调用p之前,您的设置中首先评估aboutToWin

分开通话。

auto ret = aboutToWin(a3, p, true);
std::cout << "\nShould be 1, 5: " << ret << ", " << p;