矩阵乘法在C++中不起作用

Matrix multiplication not working in C++

本文关键字:C++ 不起作用      更新时间:2023-10-16

我制作了一个程序,计算2D数组列中所有元素的乘积,并将该值存储在另一个1D数组中。这是我的代码:

void product_of_col(int n)
{
    int i, j, product;
    for(i = 0; i < n; i++)
    {
        product = 1;
        for(j = 0; j < n; j++)
            product *= a[j][i];
        b[i] = product;
    }
}

这个功能运行良好,但当我更改时

for(j = 0; j < n; j++)
    product *= a[j][i];

for(j = 0; j < n; j++, product *= a[j][i]);

每个乘积都等于0。我在Ideone上运行了这个代码,但它不起作用。我还制作了一个函数来计算同一列中所有元素的总和,它对两种代码都很好。

有人能告诉我为什么第二个代码不起作用吗?

您的订单有误。用for(j = 0; j < n; product *= a[j][i], j++); 替换for(j = 0; j < n; j++, product *= a[j][i]);

请注意,在第二个代码段中,表达式j++在表达式product *= a[j][i]之前执行,因为逗号运算符的工作方式。

好吧,这是您(可能)在C++类中没有学到的东西。我知道我肯定没有。

逗号运算符

您可能知道c++中的"运算符"一词。你有+-=*/,等等。你可能不知道有一个逗号运算符(,)。逗号运算符到底干什么?基本上,它评估语句中的所有内容,但只返回第一个值。所以我可以做

int a = 1,2,3,4;

并且a将仅等于1。另外,我可以做

int x = 5; int y = 10;
int z = (y*=2), (x*=2);
std::cout << x << ',' << y << ',' << z << std::endl;

其将输出10、20和20。您在for循环中实际要做的是调用这个逗号运算符。就您的情况而言,我们正在查看声明

j++,乘积*=a[j][i]

我发现把这看作以下调用是有帮助的:

const int&comma_operator(const int&a,const int&b){返回a;}comma_operator(j++,生成*=a[j][i]);

现在您已经了解了逗号的实际作用,让我们来看看评估顺序的概念。

评估顺序

C++没有承诺函数调用或运算符的参数调用顺序,只是在函数或运算符运行之前调用它们。这似乎有违直觉:你可能在想,为什么它不从左到右?

在很多情况下,这会束缚编译器的手脚,因为它可以优化代码中的垃圾。常见的例子是:

int x;int y;int z=x/y+x%y。

在这种情况下,大多数CPU可以使用相同的指令计算x/yx%y。当然,这对你来说没有意义,但加的第一个参数和加的第二个参数是在同一时间计算的,而不是按顺序计算的。

C++只保证代码的行为与逻辑编写的代码相同,而不是与编写的代码完全相同。操作数的求值顺序不属于该逻辑。

所以只要使用for(j = 0; j < n; j++) product *= a[j][i];,你就会很开心。

Can anyone tell me why isn't the second code working?

在你的第二个代码中,

for(j = 0; j < n; j++, product *= a[j][i]);

在执行product *= a[j][i])之前,您正在递增j。所以,只需更改订单,如:

for(j = 0; j < n; product *= a[j][i], j++);