在 C 中,是单 & 和单 |有效以避免短路?还请给出一些在 C# 中的实用程序示例

In C, is single & and single | valid so as to avoid short circuit? Also please give some examples of utility of same in C#

&& 是逻辑与,|| 是逻辑或

在 C# 中,例如,

using System;

class Program {
    static void Main() {
        Console.WriteLine("Enter a number");
        int num = int.Parse(Console.ReadLine());
        if(num>=0&&num<=10)
            Console.WriteLine("Hi");
        else
            Console.WriteLine("Hello");
    }
}

现在 && 仅当两个条件都为真时,才执行 if 块,否则执行 else 块。

所以对于输入2条件num>=0num<=10都是true。所以条件 num>=0&&num<=10true 并且 if 语句被执行。得到输出 Hi.

对于输入 -2 条件 num<=10true 但条件 num>=0false。由于两个条件都应为真,条件 num>=0 && num<=10 为假,因此执行 for 语句而不是 else 语句。所以输出是 Hello.

对于输入 12 条件 num>=0true 但条件 num<=10false。由于两个条件都应为真,条件 num>=0 && num<=10 为假,因此执行 for 语句而不是 else 语句。所以输出是 Hello.

现在,在这种情况下,如果第一个条件 num>=0 结果是 flase,编译器不会检查第二个条件 num<=10,因为在 && 的情况下如果两个条件都是true,那么只有num>=0&&num<=10true.

现在考虑下面的程序-

using System;

class Program {
    static void Main() {
        Console.WriteLine("Enter a number");
        int num = int.Parse(Console.ReadLine());
        if(num>=0&num<=10)
            Console.WriteLine("Hi");
        else
            Console.WriteLine("Hello");
    }
}

这里给出的不是&&,而是&

输出将与真相相同 table 因为 &&& 相同。

但是在这里,在评估条件 num>=0&num=<10 期间,如果输入是 -2,那么第一个条件 num>=0false。但与 && 不同的是,即使在第一个条件为 false 之后,第二个条件 num<=10 也会被评估,然后控制传递到下一个语句。


与逻辑或类似;考虑以下 C# 示例 -

using System;

class Program {
    static void Main() {
        Console.WriteLine("Enter a number");
        int num = int.Parse(Console.ReadLine());
        if(num<=0||num>=10)
            Console.WriteLine("Hi");
        else
            Console.WriteLine("Hello");
    }
}

如果输入是-2,第一个条件num<=0true,第二个条件num>=10false。因为在 || num<=0||num>=10true 如果两个语句中的任何一个是 true,所以 if 块被执行并且输出是 Hi

如果输入是 12 第一个条件 num<=0false 但第二个条件 num>=10true。对于 || num<=0||num>=10true 如果任一条件是 true,那么 if 块被执行并且输出是 Hi.

如果输入是2第一个条件num<=0false。第二个条件 num>=10 也是错误的。由于两个条件都是 false num<=0||num>=10flase 并且 else 块被执行。所以输出是 Hello

现在考虑下面的程序-

using System;

class Program {
    static void Main() {
        Console.WriteLine("Enter a number");
        int num = int.Parse(Console.ReadLine());
        if(num<=0|num>=10)
            Console.WriteLine("Hi");
        else
            Console.WriteLine("Hello");
    }
}

这里用|代替||。这两个程序都生成相同的输出,因为 ||| 的真值 table 是相同的。

但是当使用||并且输入是-2时,第一个条件num<=0true。由于 num<=0||num>=10true 任一条件需要为 true 并且第一个条件 num<=0 已经为真,编译器不会检查第二个条件 num>=10

但是当使用 | 并且这里的输入也是 -2 时,即使在评估第一个条件 num<=0 为真之后,编译器也会检查第二个条件 num>=10


C

中“"Short Circuit"的概念

让我们考虑以下示例 -

#include <stdio.h>
int main() {
    int a, b, c;
    a = -1;
    b = 0;
    c = ++a && ++b;
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    return 0;
}

预期输出:

a = 0, b = 1, c = 0

实际输出:

a = 0, b = 0, c = 0

这是因为在语句c = ++a && ++b;中,当a的值增加1时,它的新值是00 被评估为 false。在 && 中,如果第一个条件或第二个条件为 false,则整个条件为 false。所以这里因为 ++a 被评估为 false 条件 ++b 永远不会被编译器检查。所以 b 永远不会递增,它的值保持 0

现在考虑下面的例子-

#include <stdio.h>

int main() {
    int a, b, c;
    a = 0;
    b = 10;
    c = ++a || ++b;
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    return 0;
}

预期输出:

a = 1, b = 11, c = 1

实际输出:

a = 1, b = 10, c = 1

此处声明

c = ++a || ++b;

++a1 并且 1 被评估为 true。在 || 中,如果第一个条件或第二个条件为 true,则整个条件为 true。这里因为第一个条件 ++a 为真,第二个条件 ++b 永远不会被编译器检查。所以 b 的值永远不会增加并保持 10.


现在,我的问题 -

  1. &|在C中是否有效,可以避免短路?

  2. 在 C# 中 bool 只能是 truefalsenull。不像 C 0 不是 false 并且所有 non-zero 值都不是 true。 所以在 C# 中永远不会发生短路。那么在 C# 中 &| 的效用是什么?

单字符运算符&|分别是按位与和或。它们与使用短路 &&|| 的布尔测试无关。

我不太明白你问题的意义:

  1. 它们是"valid",它们是C运算符,但它们不是用于布尔逻辑,而是用于计算二进制结果。
  2. 在 C# 中,它们似乎有双重用途,在 the operators documentation 中描述为 "Integer bitwise AND, Boolean logical AND"。但我不使用 C#。

& 和 |不是逻辑运算符。将它们用作逻辑运算符利用了 C 语言的特性,即零为假,非零为真(这不是完全类型安全的)。

C# 是一种完全类型安全的语言,因此逻辑表达式必须是布尔值。这意味着逻辑运算符仅适用于布尔值(&&、||),而位运算仅适用于整数类型(&、|、^)

基本上,&, | 的目的并且 ^ 运算符不是在 C 中进行逻辑测试,只是该语言的类型不安全,足以允许将其作为副作用。

编辑:我的观点得到纠正,(&、|) 在 C# 中显然也是有效的逻辑运算符(只有 shorthand 用于 &&、||)

以下是您问题的答案:

Is & and | valid in C so that short circuit can be avoided?

没有。 C 中的 &| 运算符与它们在 C# 中的逻辑运算符相比具有不同的含义。

在 C 中,&| 是按位运算符。他们将评估两侧并根据运算符组合结果值的 。之后,如果在 逻辑 上下文中使用结果值,它将被处理为 0=false,其他所有内容=true。

这与 C# 中的短路逻辑运算符不同

In C# bool can only be true, false or null. Unlike C 0 is not false and all non-zero value is not true. So short circuit can never take place in C#.

So in C# what is the utility of & and |?

&| 作为 C# 中的逻辑运算符的目的是支持非短路计算。

举个例子:

// s is string
if (s != null && s.Length > 0) { ... }

这里,如果s确实是null,第一个操作数的值是false,因此整个表达式永远不可能是true,因此第二个操作数,s.Length > 0 评估。

与此对比:

if (s != null & s.Length > 0) { ... }

注意我这里切换到了非短路&运算符。在这里,如果 s 为 null,both 操作数仍将被评估,代码将抛出 NullReferenceException.

在某些情况下,即使您知道无论第二个操作数怎么说,结果都永远不会为假,但您对双方都进行评估可能是有益的并且要求您这样做。在这些情况下,您将使用非短路运算符。


在 C 中,运算符的意思是:

  • | = 按位或运算符
  • & = 按位与运算符
  • || = 短路的逻辑或运算符
  • && = 短路的逻辑与运算符

在 C# 中,运算符的意思是:

  • | = 按位或运算符 如果应用于整数,逻辑非短路或运算符如果应用于布尔值
  • & = 按位与运算符 如果应用于整数,逻辑非短路与运算符如果应用于布尔值
  • || = 短路的逻辑或运算符
  • && = 短路的逻辑与运算符