我正在编写一个程序,在其中我使用if语句来检查某些条件;如果是,我增加一个计数器。问题是,只要语句为真,变量就会无限增加或随机增加。
如果条件符合但没有运气,我一直试图使用某个条款来突破这个陈述
我的代码:
if(res_vect_angle >=60 && res_vect_angle <=100 && left_mag_b >100)
{
//line(drawing, *iter_s, *(iter_s -1), Scalar( 255, 255, 255 ), 2,8 );
left_hook_count++;
cout<<"Left Hook:..........................!!! "<<left_hook_count<<endl;
if(left_hook_count++ == true)
{
break;
}
}
与问题相关的整个代码块:
float M1, M2;
float A1, A2;
double left_mag_a, left_mag_b;
double res_vect_angle;
int i = 0;
for(vector<Point>::iterator iter_lh = Leftarm.begin(); iter_lh != Leftarm.end(); ++iter_lh)
{
if(iter_lh->y <=240 && iter_lh->y >=60 && iter_lh->x >=340 && iter_lh->x <=680)
{
left_detect.push_back(*iter_lh);
if(i % 4 == 0)
{
if(left_detect.size()>4)
{
for(vector<Point>::iterator iter_s = left_detect.begin()+3; iter_s != left_detect.end(); ++iter_s, i++)
{
//Resultant Magnetude
M1 = pow((double) iter_s->x + (iter_s -2)->x,2);
M2 = pow((double) iter_s->y + (iter_s -2)->y,2);
left_mag_a = (M1 + M2);
left_mag_b = sqrt(left_mag_a);
//Resultant Angle
A1 = abs(iter_s->x - (iter_s -2)->x);
A2 = abs(iter_s->y - (iter_s -2)->y);
res_vect_angle = abs(atan2(A1,A2) * 180 /PI);
//cout<<"LEFT HOOK ANGLE IS: "<<res_vect_angle<<endl;
if(res_vect_angle >=60 && res_vect_angle <=100 && left_mag_b >100)
{
//line(drawing, *iter_s, *(iter_s -1), Scalar( 255, 255, 255 ), 2,8 );
left_hook_count++;
cout<<"Left Hook:..........................!!! "<<left_hook_count<<endl;
if(left_hook_count++ == true)
{
break;
}
}
}
}
}
}
}
希望这有助于男人ps。 left_hook_count++;
是在main()之上声明的int变量。
答案 0 :(得分:1)
最好的解决方案可能是反转测试,并使外部if
的其余部分成为条件:
if (whatever) {
// do some stuff
if (left_hook_count != true) { // or whatever the test should really be
// do some more stuff
}
}
您可以使用goto
在外部if
之后添加标签来获取所需的计划流程,但you don't want to。
另一方面,听起来这可能是循环中的,如果计数器已递增,您根本不想进入if
块?在这种情况下,你想要:
if (left_hook_count == 0 && whatever) {
// do some stuff
}
答案 1 :(得分:0)
你可以否定条件,而不是试图突破的if:
if(...) {
if(!left_hook_count++) {
// Do what you need to do
}
}
答案 2 :(得分:0)
您可以提供更多详细信息,以便我们了解最新情况。
你可能没有初始化它? 并再次检查
if(left_hook_count++ == true)
它会再次增加不必要的次数和第一次计数(0:它不会发生)
我猜你正在使用一些递归函数。所以检查Break条件(所有测试用例)。
答案 3 :(得分:0)
请勿将left_hook_count++
与true
进行比较。在此上下文中,true
等于1,一旦left_hook_count
超过1,此测试将失败,代码将永远不会达到break
。
你没有突破if语句。你打破了循环;循环内break
语句中的if
是这样做的一种方式。
答案 4 :(得分:0)
我的新答案:
:mylabel if (some_condition)
{
//code
if (some_condition) {break mylabel;}
//code
}
我的旧答案:将if语句替换为包含无条件中断的while语句。 (旧答案是在我学会将标签附加到语句块之前。)
在你的情况下:
while(res_vect_angle >=60 && res_vect_angle <=100 && left_mag_b >100)
{
//line(drawing, *iter_s, *(iter_s -1), Scalar( 255, 255, 255 ), 2,8 );
left_hook_count++;
cout<<"Left Hook:..........................!!! "<<left_hook_count<<endl;
if(left_hook_count++ == true)
{
break;
}
break; //this unconditional break makes the while loop act as an if statement
}
但是如果你在条件中断之后没有代码那么有什么意义呢?我假设你省略了那段代码?你编写它的方式就是打破内部for循环。