当我指定
时 int r, s, t, u, v;
if条件都不起作用。可能是因为所有变量都分配了一些垃圾值。
当我指定
时 int r=0, s=0, t=0, u=0, v=0;
所有if条件都有效。是因为所有这些都被分配了固定值,而且它没有改变?
任何人都可以告诉我一个使用变量的条件运行的方法。
int r, s, t, u, v;
if((mouseXPos < 130 && mouseXPos > 30 && mouseYPos > 365 && mouseYPos < 410)&&(s==0)&& (t==0)&&(u==0)&&(v==0))
{
drawMenu(0);
r=1;
}
if((mouseXPos < 230 && mouseXPos > 130 && mouseYPos > 365 && mouseYPos < 410)&&(r==0)&&(t==0)&&(u==0)&&(v==0))
{
drawMenu(1);
s=1;
}
if((mouseXPos < 330 && mouseXPos > 230 && mouseYPos > 365 && mouseYPos < 410)&&(r==0)&&(s==0)&&(u==0)&&(v==0))
{
drawMenu(2);
t = 1;
}
if((mouseXPos < 430 && mouseXPos > 330 && mouseYPos > 365 && mouseYPos < 410)&&(r==0)&&(s==0)&&(t==0)&&(v==0))
{
drawMenu(3);
u = 1;
}
if((mouseXPos < 530 && mouseXPos > 430 && mouseYPos > 365 && mouseYPos < 410)&&(r==0)&&(t==0)&&(u==0)&&(s==0))
{
drawMenu(4);
v = 1;
}
if(mouseXPos < 130 && mouseXPos > 30 && mouseYPos < 185 && mouseYPos > 140)
{
drawMenu(5);
}
答案 0 :(得分:0)
在将变量初始化为特定值之前,无法比较变量。如果这样做,实际上是在与存储在该变量中的垃圾值进行比较。
在第一个if()
语句中,您将s,t,u,v变量分隔为某个特定值。在那之前,t,u,v应该有一些价值。您刚刚声明了这些变量并且尚未初始化它们。正如你猜对了,他们会有一些垃圾值,可能是0,也可能不是0(大多数情况下它不是0),这就是为什么那些条件没有被执行的原因。
答案 1 :(得分:0)
如果您没有传递任何值,则无法比较int。如果你在函数中声明int是正确的,但如果你在函数之外声明它(全局),它们的值为0,即使你没有传递任何值。
答案 2 :(得分:0)
没有静态存储类的未初始化变量的值在显式分配之前是未定义的,但即使将它们初始化为零,它们也不是“固定”的;变量在示例中的代码中的各个点重新分配。
例如,首先条件测试s
,t
,u
和v
,但修改r
,因此如果满足第一个条件,则在后续条件r为1,因此不满足以下所有条件。
它看起来是一种执行一对一条件块的相当复杂的方法,因为当匹配任何条件时,它会设置一个阻止所有其他条件匹配的变量。如果这是意图,那么有更简单的方法 - 例如,它更简单:
int r = 0 ;
int s = 0 ;
int t = 0 ;
int u = 0 ;
int v = 0 ;
if ( mouseXPos < 130 && mouseXPos > 30 &&
mouseYPos > 365 && mouseYPos < 410 )
{
drawMenu(0);
r=1;
}
else if( mouseXPos < 230 && mouseXPos > 130 &&
mouseYPos > 365 && mouseYPos < 410)
{
drawMenu(1);
s=1;
}
else if( mouseXPos < 330 && mouseXPos > 230 &&
mouseYPos > 365 && mouseYPos < 410)
{
drawMenu(2);
t = 1;
}
else if( mouseXPos < 430 && mouseXPos > 330 &&
mouseYPos > 365 && mouseYPos < 410 )
{
drawMenu(3);
u = 1;
}
else if( mouseXPos < 530 && mouseXPos > 430 &&
mouseYPos > 365 && mouseYPos < 410 )
{
drawMenu(4);
v = 1;
}
else if( mouseXPos < 130 && mouseXPos > 30 &&
mouseYPos < 185 && mouseYPos > 140 )
{
drawMenu(5);
}
在所有这些中,将r,s,t,u和v设置为1只在后续代码中使用时才有意义 - 否则它们完全是冗余的并且可以省略。即使是id,它们也不是多余的,因为没有或只有一个被设置为1,相同的信息可以由值为0到5的单个变量表示(即与传递给drawMenu()
的参数完全相同每个条件。
很难看出这段代码有任何明确的语义感;这使你试图理解它变得更加困难 - 你试图回答两个问题; 它是如何工作的?和它做了什么?。
除了一个条件外,您只是在不必要地测试相同的mouseYpos条件 - 代码可以进一步简化:
if( mouseYPos > 365 && mouseYPos < 410 )
{
if ( mouseXPos < 130 && mouseXPos > 30 )
{
drawMenu(0);
}
else if( mouseXPos < 230 && mouseXPos > 130 )
{
drawMenu(1);
}
else if( mouseXPos < 330 && mouseXPos > 230 )
{
drawMenu(2);
}
else if( mouseXPos < 430 && mouseXPos > 330 )
{
drawMenu(3);
}
else if( mouseXPos < 530 && mouseXPos > 430 )
{
drawMenu(4);
}
}
else if( mouseXPos < 130 && mouseXPos > 30 &&
mouseYPos < 185 && mouseYPos > 140 )
{
drawMenu(5);
}
再次这可以进一步简化,因为如果你已经测试过mouseXPos&lt; 130在一次测试中,没有必要在nect测试中检查> 130;这是隐含的(我假设在130这里确切地等于130是不重要的,并且你实际上打算&lt; 130和&gt; = 130:
if( mouseYPos > 365 && mouseYPos < 410 )
{
if ( mouseXPos < 130 && mouseXPos > 30 )
{
drawMenu(0);
}
else if( mouseXPos < 230 )
{
drawMenu(1);
}
else if( mouseXPos < 330 )
{
drawMenu(2);
}
else if( mouseXPos < 430 )
{
drawMenu(3);
}
else if( mouseXPos < 530 )
{
drawMenu(4);
}
}
else if( mouseXPos < 130 && mouseXPos > 30 &&
mouseYPos < 185 && mouseYPos > 140 )
{
drawMenu(5);
}
此外,您可以利用drawMenu()
参数和鼠标位置之间的算术实现:
if( mouseYPos > 365 && mouseYPos < 410 )
{
if( mouseXPos > 30 )
{
drawMenu( ((mouseXPos - 30) / 100) - 1 );
}
}
else if( mouseXPos < 130 && mouseXPos > 30 &&
mouseYPos < 185 && mouseYPos > 140 )
{
drawMenu(5);
}