矩阵乘法在C++中不起作用
Matrix multiplication not working in C++
我制作了一个程序,计算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/y
和x%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++);
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用