我在检查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。
答案 0 :(得分: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
(此时另一个必须为真,除非&amp;&amp;&amp;重载),然后执行if
块。
问题在于第一个条件。当true
不等于0时,它将是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)
如果&amp;&amp;是原生的,但如果它是一个重载版本,则增加x
。
答案 1 :(得分: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等于零”