在 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>=0
和num<=10
都是true
。所以条件 num>=0&&num<=10
是 true
并且 if
语句被执行。得到输出 Hi
.
对于输入 -2
条件 num<=10
是 true
但条件 num>=0
是 false
。由于两个条件都应为真,条件 num>=0 && num<=10
为假,因此执行 for
语句而不是 else
语句。所以输出是 Hello
.
对于输入 12
条件 num>=0
是 true
但条件 num<=10
是 false
。由于两个条件都应为真,条件 num>=0 && num<=10
为假,因此执行 for
语句而不是 else
语句。所以输出是 Hello
.
现在,在这种情况下,如果第一个条件 num>=0
结果是 flase
,编译器不会检查第二个条件 num<=10
,因为在 &&
的情况下如果两个条件都是true
,那么只有num>=0&&num<=10
是true
.
现在考虑下面的程序-
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>=0
是 false
。但与 &&
不同的是,即使在第一个条件为 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<=0
是true
,第二个条件num>=10
是false
。因为在 ||
num<=0||num>=10
是 true
如果两个语句中的任何一个是 true
,所以 if
块被执行并且输出是 Hi
。
如果输入是 12
第一个条件 num<=0
是 false
但第二个条件 num>=10
是 true
。对于 ||
num<=0||num>=10
是 true
如果任一条件是 true
,那么 if
块被执行并且输出是 Hi
.
如果输入是2
第一个条件num<=0
是false
。第二个条件 num>=10
也是错误的。由于两个条件都是 false
num<=0||num>=10
是 flase
并且 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<=0
是true
。由于 num<=0||num>=10
为 true
任一条件需要为 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
时,它的新值是0
。 0
被评估为 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;
++a
是 1
并且 1
被评估为 true
。在 ||
中,如果第一个条件或第二个条件为 true
,则整个条件为 true
。这里因为第一个条件 ++a
为真,第二个条件 ++b
永远不会被编译器检查。所以 b
的值永远不会增加并保持 10
.
现在,我的问题 -
&
和|
在C中是否有效,可以避免短路?
在 C# 中 bool
只能是 true
、false
或 null
。不像 C 0
不是 false
并且所有 non-zero
值都不是 true
。
所以在 C# 中永远不会发生短路。那么在 C# 中 &
和 |
的效用是什么?
单字符运算符&
和|
分别是按位与和或。它们与使用短路 &&
和 ||
的布尔测试无关。
我不太明白你问题的意义:
- 它们是"valid",它们是C运算符,但它们不是用于布尔逻辑,而是用于计算二进制结果。
- 在 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# 中,运算符的意思是:
|
= 按位或运算符 如果应用于整数,逻辑非短路或运算符如果应用于布尔值
&
= 按位与运算符 如果应用于整数,逻辑非短路与运算符如果应用于布尔值
||
= 短路的逻辑或运算符
&&
= 短路的逻辑与运算符
&&
是逻辑与,||
是逻辑或
在 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>=0
和num<=10
都是true
。所以条件 num>=0&&num<=10
是 true
并且 if
语句被执行。得到输出 Hi
.
对于输入 -2
条件 num<=10
是 true
但条件 num>=0
是 false
。由于两个条件都应为真,条件 num>=0 && num<=10
为假,因此执行 for
语句而不是 else
语句。所以输出是 Hello
.
对于输入 12
条件 num>=0
是 true
但条件 num<=10
是 false
。由于两个条件都应为真,条件 num>=0 && num<=10
为假,因此执行 for
语句而不是 else
语句。所以输出是 Hello
.
现在,在这种情况下,如果第一个条件 num>=0
结果是 flase
,编译器不会检查第二个条件 num<=10
,因为在 &&
的情况下如果两个条件都是true
,那么只有num>=0&&num<=10
是true
.
现在考虑下面的程序-
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>=0
是 false
。但与 &&
不同的是,即使在第一个条件为 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<=0
是true
,第二个条件num>=10
是false
。因为在 ||
num<=0||num>=10
是 true
如果两个语句中的任何一个是 true
,所以 if
块被执行并且输出是 Hi
。
如果输入是 12
第一个条件 num<=0
是 false
但第二个条件 num>=10
是 true
。对于 ||
num<=0||num>=10
是 true
如果任一条件是 true
,那么 if
块被执行并且输出是 Hi
.
如果输入是2
第一个条件num<=0
是false
。第二个条件 num>=10
也是错误的。由于两个条件都是 false
num<=0||num>=10
是 flase
并且 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<=0
是true
。由于 num<=0||num>=10
为 true
任一条件需要为 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
时,它的新值是0
。 0
被评估为 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;
++a
是 1
并且 1
被评估为 true
。在 ||
中,如果第一个条件或第二个条件为 true
,则整个条件为 true
。这里因为第一个条件 ++a
为真,第二个条件 ++b
永远不会被编译器检查。所以 b
的值永远不会增加并保持 10
.
现在,我的问题 -
&
和|
在C中是否有效,可以避免短路?在 C# 中
bool
只能是true
、false
或null
。不像 C0
不是false
并且所有non-zero
值都不是true
。 所以在 C# 中永远不会发生短路。那么在 C# 中&
和|
的效用是什么?
单字符运算符&
和|
分别是按位与和或。它们与使用短路 &&
和 ||
的布尔测试无关。
我不太明白你问题的意义:
- 它们是"valid",它们是C运算符,但它们不是用于布尔逻辑,而是用于计算二进制结果。
- 在 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# 中,运算符的意思是:
|
= 按位或运算符 如果应用于整数,逻辑非短路或运算符如果应用于布尔值&
= 按位与运算符 如果应用于整数,逻辑非短路与运算符如果应用于布尔值||
= 短路的逻辑或运算符&&
= 短路的逻辑与运算符