For 循环中的逻辑异或与条件逻辑或

Logical Exclusive OR's vs Conditional Logical OR's Within An For Loop

最近我一直在做一个需要循环 运行 x 次的项目。只是想排除某些输出 x 值。

下面是我认为可行的示例:

// Create a 1-58 Loop
for (int n = 1; n < 59; n++)
{
    // Exclude Values
    if (n != 2 || n != 11 || n != 16 || n != 40)
    {
        // Display Data
        Console.WriteLine(n);
    }
}

操作n != 2 || n != 11 || n != 16 || n != 40在任何正常情况下都会排除不等于!=x的值。然而,这不起作用并且仍然呈现所有值并在引入 or 语句 || 后忽略操作。

下面是我玩了一会儿后找到的解决方案:

// Create a 1-58 Loop
for (int n = 1; n < 59; n++)
{
    // Exclude Values
    if (n == 2 ^ n == 11 ^ n != 16 ^ n == 40)
    {
        // Display Data
        Console.WriteLine(n);
    }
}

所以我的问题是为什么逻辑独占 || 在 for 循环中不起作用,而条件逻辑 ^ 却可以?我正在从 this wiki 中提取我的信息。如果我有什么不对的地方,请毫不犹豫地纠正我!

if (n != 2 || n != 11 || n != 16 || n != 40)

这在 2 上是正确的。因为 2 不是 11。

如果你想排除那些。你应该这样做:

if (n != 2 && n != 11 && n != 16 && n != 40)

^就是logical exclusive OR, while || is the conditional logical OR。 Exclusive OR 与 OR 的不同之处在于,Exclusive OR 要求 一个且只有一个 条件的计算结果为 true,而条件 OR 也将 return true if both 条件评估为 true.

另请注意,一旦任何条件的计算结果为 true(从左到右计算),条件 OR (||) 将 return;没有其他条件被评估,因为它们不会影响结果(这使得它不同于 | 运算符,其中所有条件都被评估)。

让我们看一下有效的语句:

if (n == 2 ^ n == 11 ^ n != 16 ^ n == 40)

如果我们将其分解为要排除的值之一,例如 2,我们有:

if (true ^ false ^ true ^ false) =>
       \   /      /       /
        \ /      /       /
if (   true ^ true ^ false     ) =>
          \   /       /
           \ /       /
if (      false ^ false        ) =>
              \   / 
               \ /
if (          false            )

然后让我们看看的条件,现在我们明白为什么了:

if (n != 2 || n != 11 || n != 16 || n != 40)

对于数字 2,这变成:

if (false || true || true || true)
         \   / 
          \ /
if (     true                    )     // evaluation stops at the first `true` result

那么在这种情况下我们还能做什么呢?好吧,我们可以将 || 运算符与 && 运算符(即 conditional logical AND 运算符)交换,只有 returns true 如果 两个条件评估为true(如果任何条件returns false,它也会短路,因为不需要进一步评估)。

一起来看看:

if (n != 2 && n != 11 && n != 16 && n != 40)

对于数字 2,这变成:

if (false && true && true && true)
         \   / 
          \ /
if (     false                   )     // evaluation stops at the first `false` result