矩阵乘法不适用于C ++

时间:2014-04-19 11:58:36

标签: c++ c arrays matrix

我制作了一个程序,用于计算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上运行此代码并且它不起作用。我还创建了一个函数来计算同一列中所有元素的总和,它适用于两个代码。

任何人都可以告诉我为什么第二个代码不起作用?

4 个答案:

答案 0 :(得分:2)

你的订单错了。将for(j = 0; j < n; j++, product *= a[j][i]);替换为for(j = 0; j < n; product *= a[j][i], j++);

答案 1 :(得分:1)

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

答案 2 :(得分:1)

好吧,这是你(可能)没有在你的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 ++,product * = a [j] [i]

我觉得将此视为以下调用很有帮助:

const int&amp; comma_o​​perator(const int&amp; a,const int&amp; b){return a;}    comma_o​​perator(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];,你就会感到高兴。

答案 3 :(得分:0)

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

在你的第二个代码中,

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

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

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