【问题标题】:Why use a single variable as a conditional evaluation?为什么使用单个变量作为条件评估?
【发布时间】:2014-06-17 22:32:35
【问题描述】:

以我在整个编程过程中理解条件的方式,无论是 if 语句、while 循环等 - 将特定语句检查为真或假。

这是我通常使用条件的方式,但我经常遇到其他人的代码包含奇怪的条件,其中似乎没有特定的评估,只是一个普通的变量。例如:

someType aVariable = someValue;

If (aVariable) 
{
 //do this
}

在这种情况下,什么会被评估为真或假?显然,如果 aVariable 表示布尔值,那将很简单,但通常显式值根本不是布尔值,并且通常包含 NULL。再一次,我几乎在我看过的每一种语言中都看到了这一点,所以我假设这不是特定于语言的。

编辑 1:我已经知道这可能取决于语言,我将补充一点,我在 C# 中经常看到这一点,有问题的变量可以是参考类型或值类型。

编辑 2:所有非常好的答案,我总结如下:

(a) 特定的非布尔变量是否可以被评估为布尔变量取决于语言 (b) 在许多情况下,如果语言支持这种评估,任何非零、非空或非 NULL 值通常评估为 TRUE (C/C++ int's) (c) 对于不支持这种隐式求值的语言,需要在类定义中添加转换为 bool,例如 (C#)

【问题讨论】:

  • 我确信细微差别取决于语言。在 php 中,if 语句将评估为 true,如果:aVariable 包含布尔值 true、任意长度的字符串、包含任何非空元素的数组、包含任何非空元素的对象或零以外的数字。如果aVariable 包含false、无长度字符串、数字0、空数组、空对象或null,则if 语句的计算结果为false。在 javascript 中也是如此。
  • 除非aVariablebool 或隐式转换为bool,否则您不能在C# 中执行此操作。
  • Lee - 我不能保证这个例子的真实性,但这里至少在 C# 中引用了它。查看底部附近的代码 - answers.unity3d.com/questions/439308/…
  • @StevenNikolic - 是的,看起来他们在其基础 Object 类中提供了到 bool 的隐式转换。我已经添加了答案。

标签: c# variables conditional


【解决方案1】:

正如其他答案所指出的,细节是特定于语言的。在 C# 中,您只能在 aVariablebool 或隐式转换为 bool(或实现 truefalse 运算符)时执行此操作。

在您的 Unity 链接中,它们的基本 Object 类型似乎隐式转换为 bool,返回对象是否为空,例如

public class Object
{
    public static implicit operator bool(Object b) { return b != null; }
}

【讨论】:

    【解决方案2】:

    这真的取决于编程语言。例如,在 Groovy 中,任何表达式都可以作为布尔值求值,并且有关于如何进行求值的规则。

    // groovy code
    if(someVariable) {
        // do something
    }
    

    在该代码中,someVariable 可以是任何东西,它是有效的 Groovy。规则是有特定的东西评估为假,包括布尔假、数字零、空集合、空字符串和空值。其他一切都是真的。它还有更多内容,但深入研究将是一堆 Groovy 特定的东西,我只是举例说明。

    并非所有编程语言都有这种行为。由语言设计者决定所有这些如何工作。

    【讨论】:

      【解决方案3】:

      只有在 aVariable 已经是布尔值或隐式可转换为布尔值时,这才在 C# 中有效。

      在其他语言中——尤其是 C 和 C++——在这种情况下可以使用整数。如果它们等于 0,则为 false.,否则为 true

      指针的工作方式相同 - 因为 NULL (大部分)等于0,所以类似

      float *ptr = null_ptr;
      
      if(ptr)
      {
      /// will not be executed
      }
      

      等等。

      【讨论】:

      • 感谢您的回答大卫,正如我在上面对李的评论中提到的那样,这个例子是否会被隐式转换为布尔值,如果是,我如何确定 - http://answers.unity3d.com /questions/439308/create-fading-sprite-in-c.html
      【解决方案4】:

      在许多语言中,布尔类型以外的变量的值可以被评估为真或假条件。例如,在 C/C++ 中,计算结果为 0 的值(例如包含 0int 或空指针)计算结果为 false。所有其他值都被评估为真。例如,int 值:

      int foo = 5;
      if (foo)
      {
          // This code gets run
      }
      

      在其他语言中,例如 C# 和 Java,这种行为是被禁止的 - 上面的代码会导致编译错误,因为您需要提供一个布尔表达式作为条件(在这种情况下等效为 foo != 0) .

      这是有充分理由的。通过允许将布尔值以外的值作为条件进行评估,可以引入细微的错误。例如,在上面的if 中,工程师可能本来打算写foo >= 0,但还没写完就分心了。在 C# 中,编译错误会引起他们的注意。在 C/C++ 中,如果foo 小于或大于 0,则将运行if 的主体。不会生成编译器错误,因为它是合法代码,并且存在错误介绍了。

      【讨论】:

      • 我要问:还没说完就分心了?
      • 不,这是我的回答。在对缩小范围的问题进行编辑之前,我已经回答了。最初,这似乎是一个关于如何将 bool 以外的数据类型用作条件的一般问题(并且没有指定 C#)。编辑后,很明显 OP 确实在询问 C# 中的隐式转换。嗯,李的回答是这样的。我不想编辑我的答案以包含冗余信息,但我不想删除它,因为它似乎仍然有一些价值。
      猜你喜欢
      • 2015-03-07
      • 2012-06-12
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2019-05-24
      • 2017-12-18
      相关资源
      最近更新 更多