c++ - 取消注释 cout 行如何改变最终答案?
问题描述
我有以下代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int r = 0, c = 0;
int best = 0;
cin >> r >> c;
int myGrid[r + 2][c + 2] = {};
for (int i = 1; i < r + 1; i++) {
for (int j = 1; j < c + 1; j++) {
cin >> myGrid[i][j];
}
}
bool stillIn = false;
int di[] = {-1,-1, -1, 0, 0, 1, 1, 1};
int dj[] = {-1,0, 1, -1, 1, -1, 0, 1};
for (int i = 1; i < r + 1; i++) {
for (int J = 1; J < c + 1; J++) {
stillIn = false;
for (int k = 0; k < 8; k++) {
// cout << myGrid[i][J] << " " << endl;
if (myGrid[i][J] == myGrid[di[k]][dj[k]]) {
stillIn = true;
}
}
if (stillIn == true) {
best = myGrid[i][J];
}
}
}
cout << best;
return 0;
}
如果我使用以下输入运行代码:
4 3
0 1 0
1 2 0
1 5 1
2 3 4
它打印 4。但是,如果我取消注释第 28 行,即
// cout << myGrid[i][J] << " " << endl;
然后它给了我1,这是正确的答案。为什么会这样!?使用 cout 如何改变最终答案?
提前感谢您的帮助。
解决方案
您有未定义的行为(UB),因为您在此行上的索引超出范围
myGrid[di[k]][dj[k]]
因为di
并且dj
包含 -1 的值。
如果您有 UB,那么任何事情都可能发生,例如cout
语句是否存在,以奇怪的方式更改程序。
标准 C++ 中也不允许使用可变长度数组。
推荐阅读
- c# - 如何获取与已登录用户相关的信息?
- android - 如何使用意图到达android中的特定目录
- python - 如何安装英伟达 Apex
- ios - 如何列出谷歌驱动器根文件夹中的文件和文件夹
- javascript - 承诺所有处理所有捕获但仍继续
- nested-if - Tableau 自定义日期筛选器
- v8 - 扩展 Object.prototype 会导致 V8 中的性能下降吗?
- apache - Apache多个子域指向一个ip但指向不同的端口
- python - psycopg2 - html(大字符串)字段的列表索引超出范围
- pdfmake - 在 PDFMake 中保持 2 列彼此相邻?