为什么
if (x) {
f();
}
如果 x
是空字符串 ""
,是否调用 f()
?
在D语言中,空字符串是否会隐式转换为布尔值 false
,就像Python和空数组一样(在D语言中)?
更新:我修正了问题。我错误地颠倒了推理逻辑。幸运的是,聪明的D语言大脑们仍然理解我的意思 ;)
为什么
if (x) {
f();
}
如果 x
是空字符串 ""
,是否调用 f()
?
在D语言中,空字符串是否会隐式转换为布尔值 false
,就像Python和空数组一样(在D语言中)?
更新:我修正了问题。我错误地颠倒了推理逻辑。幸运的是,聪明的D语言大脑们仍然理解我的意思 ;)
条件语句、if
语句和循环语句在编译器中被转换为bool
类型。因此,
if(x) {...}
变成
if(cast(bool)x) {...}
对于数组而言,将其转换为bool
类型等同于测试其ptr
属性是否不为null
。因此,它变成了:
if(x.ptr !is null) {...}
null
数组被认为与空数组相同。因此,在大多数情况下,您并不关心数组是否为null
。数组本质上是一个类似结构体的东西。struct Array(T)
{
T* ptr;
size_t length;
}
==
运算符将检查ptr
引用的所有元素是否相等,但如果两个数组的长度都是0
,它就不关心ptr
的值是什么。这意味着""
和null
是相等的([]
和null
也是相等的)。然而,is
运算符显式地检查ptr
属性是否相等,因此根据is
运算符,""
和null
不会相同,特定的空数组是否具有null
ptr
取决于它的值的设置方式。因此,数组为空并不能说明它是否为null
。您必须使用is
运算符进行确定。if(x) {...}
if(x.empty) {...}
或者
if(x.length == 0} {...}
或者你真的关心它是null
吗?在这种情况下,请使用is
运算符:
if(x is null) {...}
数组在条件语句中的行为与语言的其他部分一致(例如,指针和引用类型会检查它们是否为null
),但不幸的是,在实践中,这种数组行为很容易出现错误。因此,我建议您永远不要将数组单独放在if
语句或循环的条件中。
.ptr
,这意味着只有默认初始化的数组(或明确设置为null)才会评估为false。\0
结尾的,这意味着("")[0] == '\0'
,因此("").ptr
不能为null(否则会导致段错误)。当我尝试时,它可以正常工作...
void main() {
import std.stdio;
string s = "";
if(s)
writeln("true"); // triggered
}
false
。我一直认为不包含任何信息的类型实例应该隐式转换为 false
。只是出于好奇...在什么情况下您希望出现这种行为? - Nordlöwnull
被映射到“未定义”,而""
被映射到零/空。 - Nordlöw