Skip to content

C# - 逻辑运算符

C# 中的逻辑运算符用于对 bool(布尔)操作数执行布尔逻辑运算。它们通过将多个条件组合成一个 true 或 false 结果,对于控制条件语句和循环中的程序流程至关重要。

C# 提供了三个主要的逻辑运算符。假设变量 A 为 true,变量 B 为 false。

运算符符号描述示例
逻辑与&&仅当两个操作数都为 true 时才返回 true。(A && B) 为 false。
逻辑或||如果至少一个操作数为 true,则返回 true。(A || B) 为 true。
逻辑非!反转其操作数的布尔值。true 变为 false,false 变为 true。!B 为 true。

&&(逻辑与)和 ||(逻辑或)运算符都执行短路求值(short-circuiting)。这是一个重要的优化和行为,需要理解:

  • &&(逻辑与):如果第一个操作数为 false,则第二个操作数永远不会被求值,因为总结果必然是 false。
  • ||(逻辑或):如果第一个操作数为 true,则第二个操作数永远不会被求值,因为总结果必然是 true。
public bool IsValid() {
Console.WriteLine("IsValid method called.");
return true;
}
// 对于 &&,IsValid() 不会被调用,因为第一个条件是 false。
bool result1 = (5 < 3) && IsValid();
Console.WriteLine($"Result 1: {result1}");
// 对于 ||,IsValid() 不会被调用,因为第一个条件是 true。
bool result2 = (5 > 3) || IsValid();
Console.WriteLine($"Result 2: {result2}");
// 输出:
// Result 1: False
// Result 2: True

注意:C# 还有非短路位运算符 & 和 |,它们总是对两个操作数进行求值。这些通常用于位级操作,而不是用于一般的逻辑流程控制。

我们需要验证用户名和密码是否都正确。

string username = "admin";
string password = "pass123";
if (username == "admin" && password == "pass123")
{
Console.WriteLine("Login successful.");
}
else
{
Console.WriteLine("Invalid credentials.");
}
// 输出:Login successful.

如果顾客是会员或他们的购买金额超过 100 美元,他们就能获得折扣。

bool isMember = false;
double purchaseAmount = 120.0;
if (isMember || purchaseAmount > 100)
{
Console.WriteLine("Discount applied.");
}
else
{
Console.WriteLine("No discount available.");
}
// 输出:Discount applied.

我们希望仅当用户未登录时才提示他们登录。

bool isLoggedIn = false;
if (!isLoggedIn)
{
Console.WriteLine("Please log in to continue.");
}
else
{
Console.WriteLine("Welcome back!");
}
// 输出:Please log in to continue.

您可以组合多个运算符来创建复杂的规则。使用括号 () 来确保正确的求值顺序。

int age = 25;
bool hasLicense = true;
bool isSober = true;
// 如果你清醒并且(你已满 18 岁并持有驾照),你就可以驾驶
if (isSober && (age >= 18 && hasLicense))
{
Console.WriteLine("Cleared to drive.");
}
else
{
Console.WriteLine("Not allowed to drive.");
}
// 输出:Cleared to drive.
  • 使用括号增加清晰度:始终使用 () 来分组条件,即使运算符优先级看起来很明显。这会使代码更易于阅读,例如 if ((user.IsAdmin || user.IsEditor) && !user.IsLockedOut)。
  • 简化否定:不要使用 if (isReady == false),而是使用更简洁、更具可读性的 if (!isReady)。
  • 避免冗余检查:不要使用 if (isValid == true),直接使用 if (isValid) 即可。
  • 利用短路求值:在 && 链中,将开销较小或更可能失败的条件放在前面。例如,在访问成员之前检查 null:if (user != null && user.IsAdmin)。
  • 提取到方法:如果逻辑条件变得过于复杂,请将其提取到一个命名良好的方法或属性中。您可以将冗长的 if 语句替换为 if (IsEligibleForPromotion(employee))。