无法根据条件访问

时间:2014-04-02 10:41:42

标签: c

当我指定

 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);
    }

3 个答案:

答案 0 :(得分:0)

在将变量初始化为特定值之前,无法比较变量。如果这样做,实际上是在与存储在该变量中的垃圾值进行比较。

在第一个if()语句中,您将s,t,u,v变量分隔为某个特定值。在那之前,t,u,v应该有一些价值。您刚刚声明了这些变量并且尚未初始化它们。正如你猜对了,他们会有一些垃圾值,可能是0,也可能不是0(大多数情况下它不是0),这就是为什么那些条件没有被执行的原因。

答案 1 :(得分:0)

如果您没有传递任何值,则无法比较int。如果你在函数中声明int是正确的,但如果你在函数之外声明它(全局),它们的值为0,即使你没有传递任何值。

答案 2 :(得分:0)

没有静态存储类的未初始化变量的值在显式分配之前是未定义的,但即使将它们初始化为零,它们也不是“固定”的;变量在示例中的代码中的各个点重新分配。

例如,首先条件测试stuv,但修改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);
}