我在整个编程中理解条件的方式,无论是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#)
答案 0 :(得分:4)
正如其他答案所指出的,细节是特定于语言的。在C#中,只有当aVariable
为bool
或隐式转换为bool
(或实现true
和false
运算符)时才能执行此操作。< / 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
的正文。不会生成编译器错误,因为它是合法代码,并引入了一个错误。