为什么使用单个变量作为条件评估?

时间:2014-06-17 22:32:36

标签: c# variables conditional

我在整个编程中理解条件的方式,无论是if语句,while循环等等 - 特定语句被检查为true或false。

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

someType aVariable = someValue;

If (aVariable) 
{
 //do this
}

在这种情况下,评估为真或假的是什么?显然,如果aVariable代表一个bool,那将是直截了当的,但通常显式值根本不是bool,并且通常包含NULL。我再一次看到了几乎所有我看过的语言,所以我假设这不是语言特定的。

编辑1 :由于我已经意识到这可能取决于语言,我将补充一点,我经常在C#中看到这个,并且有问题的变量可以是引用类型或值类型。

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

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

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

如果aVariable已经是布尔值,或者可以隐式地转换为布尔值,那么它只适用于C#。

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

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

的操作
float *ptr = null_ptr;

if(ptr)
{
/// will not be executed
}

等等。

答案 3 :(得分:2)

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

int

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

这有充分的理由。通过允许将除布尔值之外的值作为条件进行求值,可以引入细微的错误。例如,在上面的int foo = 5; if (foo) { // This code gets run } 中,工程师可能打算写foo != 0,但在完成之前会分心。在C#中,编译错误会引起他们对错误的注意。在C / C ++中,如果if小于或大于 0,则运行foo >= 0的正文。不会生成编译器错误,因为它是合法代码,并引入了一个错误。