-3

我在检查 0 时遇到问题,我试图从文件中获取数字(我明白了)但如果是 0,那么我说>

0 maybe its not found!(0 | 0)   
0 maybe its not found!(1 | 1)   
0 maybe its not found!(2 | 2)   
0 maybe its not found!(3 | 3)   
0 maybe its not found!(4 | 4)

如果我想要 1 并且我从行中得到正确的行:

0 maybe its not found!(0 | 0)   
[Line0]: 1 1 1 200 150 6 1 10000000 1     
[Line1]: 1 1 13 14    
0 maybe its not found!(2 | 2)     
0 maybe its not found!(3 | 3)     
0 maybe its not found!(4 | 4)

检查功能是:

int myClass = 0; //'\0'
for(int i=0; i < Show.line0 && Show.line1; i++)
{
    if( Show.Get[i].m_Class0 && Show.Get[i].m_Class1 == myClass )
    {
      ........
    }
    else
    {
        cout << myClass; cout << " maybe its not found!";
        cout << "(";
        cout << Show.Get[i].m_Class0; 
        cout << " | ";
        cout << Show.Get[i].m_Class1; 
        cout << ")"; 
        cout << endl;
    }

m_class0/1 是 int 并且它的值是从加载的文件中获取的。在 myClass 上大于 0 的其他值中,我从文件中获取以想要的数字开头的相同行,但不适用于 0。

4

2 回答 2

1

您的错误在于以下行:

if( Show.Get[i].m_Class0 && Show.Get[i].m_Class1 == myClass )

在这里,编译器评估:

Show.Get[i].m_class0

如果是true,编译器继续评估:

Show.Get[i].m_Class1 == myClass

如果是这样true(此时另一个必须为真,除非 && 被重载),则if块执行。

问题在于第一个条件。当不等于 0true时。Show.Get[i].m_Class0

在这种情况下,您真正​​想要的是相反的(因为myClass是 0):

if( Show.Get[i].m_Class0 == myClass && Show.Get[i].m_Class1 == myClass )

现在我在里面提到了几件事。第一个是只有在第一个是 时才会评估第二个部分true。这称为短路评估,用于节省时间。但是,如果过载operator&&,则不再发生短路。这是第二种情况,这就是为什么这样做通常不是一个好主意,因为第二种情况会产生意想不到的副作用。

例如:

if (false && ++x)

x如果 && 是本机的,则会离开,但x如果它是重载版本,则会增加。

于 2012-06-01T23:18:48.517 回答
0
if( Show.Get[i].m_Class0 && Show.Get[i].m_Class1 == myClass )

正如@chris 评论的那样,这并没有按照您的想法进行。

if (A && B == 0)并不意味着“如果 A 和 B 都等于零”

它的意思是“如果 A 为真,并且 B 等于零”并且当A为零时失败,因为零是false

你想要if (A == 0 && B == 0)这意味着“如果 A 等于零并且B 等于零”

于 2012-06-01T23:16:35.923 回答