虽然循环有两个真实的条件,但它只验证一个

时间:2017-03-10 19:55:19

标签: c# while-loop

我需要代码运行,直到while的两个条件都为真,我使用逻辑AND(&&):

while ((A.i != B.i) && (A.j != B.j))
{
    // do something
}

在运行时,循环停止,如果

A.i=B.i 

没有检查第二个条件,我做错了什么?

5 个答案:

答案 0 :(得分:4)

在使用GetPrinicpalBySamAccountName运算符的条件语句中,仅在第一个条件为&&时才评估第二个条件。这就是为什么当true你立刻突破检查时

“我需要运行代码,直到while的两个条件都为真”

这让我感到困惑,因为如果您希望A.i==B.i循环运行直到某些条件为while,那么您不希望在true中评估这些条件{1}}陈述..

如果您希望代码运行 UNTIL ,这两个条件都是真的,那么它应该是:

while()

答案 1 :(得分:3)

将您的&&切换为||

你的循环说“当A.i不等于B.i和A.J不等于B.j”循环。一旦A.i等于B.i该语句不再为真,那么循环退出(它实际上并不关心那时的第二个相等)。通过使用OR,它将循环,直到两个条件都为假。

答案 2 :(得分:1)

不清楚,但我怀疑这就是你要找的东西

while ( !(A.i == B.i && A.j == B.j) )

相同
while ( A.i != B.i || A.j != B.j) )

我想?

答案 3 :(得分:1)

OP,你的问题不是很明确,但我很确定你遇到了两个问题中的一个。

  1. 这是一个非常常见的逻辑错误

    while (a == b) || (c == d)
    

    相同
    until (a != b) && (c != d)
    

    同时,

    while (a != b) && (c != d)
    

    相同
    until (a == b) || (c == d)
    

    请注意,当您从==切换到!=时,还需要切换&& ||。许多开发人员都错过了这种非常明显的逻辑翻转(参见De Morgan's Laws)。无论如何,你只需要思考逻辑。在您的帖子中,您不清楚自己的意图,但可能只需要为&&切换||

  2. 短路评估

    听起来你想要运行逻辑的后半部分,可能是因为j的getter有一些你想要的副作用(顺便说一下这不是一个好主意)。

    如果您希望后半部分始终运行,则应使用|代替||。如果左侧是真的,||运算符不会打扰右侧。同样,如果左侧是假的,&&运算符也不会打扰右侧。这称为Short-circuit evaluation

答案 4 :(得分:0)

因为A.i!= B.i评估为假,所以不需要完成条件