在 while 循环中评估 true 的 false 条件
false condition evaluating true in while loop
我一直在调试这段简单的代码,但我仍然不明白为什么在条件评估为 false 时进入 while 循环。这是代码:
#include <iostream>
unsigned long count = 1; // we assume 2 has been found.
unsigned long primeArr[3] = {0};
bool primeArrCanDiv(unsigned long n){
for(unsigned long i = 0; i<count; i++){
if(n%primeArr[i] == 0) return true;
}
primeArr[count] = n;
return false;
}
int main(){
unsigned long j=3;
primeArr[0]=2;
while(count<3){
if(!primeArrCanDiv(j)) count++;
++j;
}
std::cout<<primeArr[count-1];
return 0;
}
关于代码的一些介绍,介绍了 2 个全局变量 count = 1
和一个数组 primeArr[3]
。现在以下部分应该 运行 直到计数达到 3 :
while(count<3){
if(!primeArrCanDiv(j)) count++;
++j;
}
但它 运行s 比它应该的多 2 倍,即使当 count 得到 = 3 时,这应该使 3<3
评估为 false,对吧?但是当计数达到 4 时它会停止。
添加 std::cout<<primeArr[count-1];
将打印 7 而不是 5。
我已经尝试在 nemiver 中调试它,它显示条件被评估为 false
并且它仍然进入循环。我知道我可能留下了一些愚蠢的想法,仍然想知道是什么原因造成的。
截图:
在 x64 arch linux
上使用精确的:g++ -g q7.cpp -o a.out
和 gcc -v gcc version 5.1.0 (GCC)
我刚刚在 Visual Studio 2013
编译并执行了你的代码
#include <iostream>
unsigned long count = 1; // we assume 2 has been found.
unsigned long primeArr[3] = { 0 };
bool primeArrCanDiv(unsigned long n){
for (unsigned long i = 0; i<count; i++){
if (n%primeArr[i] == 0) return true;
}
primeArr[count] = n;
return false;
}
int main(){
unsigned long j = 3;
primeArr[0] = 2;
while (count<3){
if (!primeArrCanDiv(j)) count++;
++j;
std::cout << "foo" << std::endl;
}
return 0;
}
输出:
foo
foo
foo
您的代码似乎按预期工作。也许您的工具集有问题?
OP 让我将我的评论变成答案。开始了。
您应该避免将语句和条件语句一起内联。始终将操作放在与 "if" 子句分开的行中。例如:
if(!primeArrCanDiv(j)) count++;
移动计数++;语句到下一行并缩进。如果您添加花括号,可加分。
这个好多了C/C++风格:
if(!primeArrCanDiv(j))
{
count++;
}
这使得代码更易于阅读和调试。将条件表达式和后续语句保持在同一行可能会使某些可视调试器感到困惑,从而显示奇怪的结果。它确实使使用调试器单步执行代码的人更容易查看实际执行了哪些语句。
我一直在调试这段简单的代码,但我仍然不明白为什么在条件评估为 false 时进入 while 循环。这是代码:
#include <iostream>
unsigned long count = 1; // we assume 2 has been found.
unsigned long primeArr[3] = {0};
bool primeArrCanDiv(unsigned long n){
for(unsigned long i = 0; i<count; i++){
if(n%primeArr[i] == 0) return true;
}
primeArr[count] = n;
return false;
}
int main(){
unsigned long j=3;
primeArr[0]=2;
while(count<3){
if(!primeArrCanDiv(j)) count++;
++j;
}
std::cout<<primeArr[count-1];
return 0;
}
关于代码的一些介绍,介绍了 2 个全局变量 count = 1
和一个数组 primeArr[3]
。现在以下部分应该 运行 直到计数达到 3 :
while(count<3){
if(!primeArrCanDiv(j)) count++;
++j;
}
但它 运行s 比它应该的多 2 倍,即使当 count 得到 = 3 时,这应该使 3<3
评估为 false,对吧?但是当计数达到 4 时它会停止。
添加 std::cout<<primeArr[count-1];
将打印 7 而不是 5。
我已经尝试在 nemiver 中调试它,它显示条件被评估为 false
并且它仍然进入循环。我知道我可能留下了一些愚蠢的想法,仍然想知道是什么原因造成的。
截图:
在 x64 arch linux
上使用精确的:g++ -g q7.cpp -o a.out
和 gcc -v gcc version 5.1.0 (GCC)
我刚刚在 Visual Studio 2013
编译并执行了你的代码#include <iostream>
unsigned long count = 1; // we assume 2 has been found.
unsigned long primeArr[3] = { 0 };
bool primeArrCanDiv(unsigned long n){
for (unsigned long i = 0; i<count; i++){
if (n%primeArr[i] == 0) return true;
}
primeArr[count] = n;
return false;
}
int main(){
unsigned long j = 3;
primeArr[0] = 2;
while (count<3){
if (!primeArrCanDiv(j)) count++;
++j;
std::cout << "foo" << std::endl;
}
return 0;
}
输出:
foo
foo
foo
您的代码似乎按预期工作。也许您的工具集有问题?
OP 让我将我的评论变成答案。开始了。
您应该避免将语句和条件语句一起内联。始终将操作放在与 "if" 子句分开的行中。例如:
if(!primeArrCanDiv(j)) count++;
移动计数++;语句到下一行并缩进。如果您添加花括号,可加分。
这个好多了C/C++风格:
if(!primeArrCanDiv(j))
{
count++;
}
这使得代码更易于阅读和调试。将条件表达式和后续语句保持在同一行可能会使某些可视调试器感到困惑,从而显示奇怪的结果。它确实使使用调试器单步执行代码的人更容易查看实际执行了哪些语句。