您可能会从Project Euler中认识到这一点。我正在尝试编写一个代码,以便从三位数字乘以找到最大的回文数。有cout<< i<< ENDL;在for循环中指示我们在过程中的位置。如果您完全按原样运行该代码,那么我将获得答案,但如果我取出cout<< i<< ENDL;然后我似乎得到零。
我不确切知道发生了什么,代码似乎工作取决于我是否包括cout来表明我在哪里......什么?
#include <iostream>
using namespace std;
bool palindromecheck(int x);
int main() {
int largest=0;
for (int i = 999; i > 0; i--) {
cout << i << endl;
for (int j = 999; j > 0; j--) {
if (palindromecheck(i*j) && i*j > largest) {
largest = i*j;
}
}
}
cout << "The largest palindrome made from multiplying two 3-digit numbers is " << largest << endl;
}
bool palindromecheck(int x) {
int z = x;
int y;
while (z != 0) {
while (z%10 != 0) {
z -= 1;
y += 1;
}
while (z%10 == 0 && z != 0) {
z /= 10;
y *= 10;
}
}
return x==y;
}
答案 0 :(得分:5)
函数y
内的局部变量palindromecheck()
未初始化。这使得程序的行为无法预测。
当包含行cout << i << endl;
时,y
会以一个使您的程序看起来正常工作的值开始。如果未包含y
,则会使用不同的值初始化y
,但它不再有效。
在这两种情况下,它只是看起来像一样有效。实际上,程序的行为是未定义的。
在外部循环之前(在其声明上)正确初始化{{1}}。
答案 1 :(得分:3)
y
变量没有初始值。这可能会导致不一致。
答案 2 :(得分:0)
你必须初始化y,这将使你的代码正常工作。
答案 3 :(得分:0)
不是您问题的答案,只是函数palindromecheck()
的简化版本:
bool palindromecheck(int x)
{
int z = x;
int y = 0;
while (z != 0) {
// Transfer the last digit of z to the end of y
y = 10 * y + z % 10;
z /= 10;
}
return x == y;
}
(包括y
的正确初始化)