我不小心写了这个简单的代码来打印终端中的字母:
var alpha:Int = 97
while (alpha <= 122) {
write(1, &alpha, 1)
alpha += 1
}
write(1, "\n", 1)
//I'm using write() function from C, to avoid newline on each symbol
我得到了这个输出:
abcdefghijklmnopqrstuvwxyz
Program ended with exit code: 0
所以,问题是:它为什么有效? 在我的逻辑中,它应该显示一行数字,因为正在使用整数变量。在C中,它将是一个char变量,所以我们意味着我们指向ASCII中某个索引处的符号。然后:
char alpha = 97;
将代码指向'a'符号,通过在循环中递增alpha变量,我们将显示ascii到122nd的每个元素。
在Swift中,我无法为Character或String类型变量分配整数。我使用了Integer,然后声明了几个变量来分配UnicodeScalar,但是我不小心发现当我调用write时,我指向我的整数,而不是UnicodeScalar类型的新变量,尽管它有效!代码非常简短易读,但我并不完全理解工作原理和原因。
有没有人有这样的情况?
答案 0 :(得分:2)
为什么会这样?
这“偶然”起作用,因为整数以小端字节顺序存储。
整数97
作为8字节存储在内存中
0x61 0x00 0x00 0x00 0x00 0x00 0x00 0x00
并在write(1, &alpha, 1)
中,该内存位置的地址为
传递给write
系统调用。自上一个参数(nbyte
)
是1,该存储器地址的第一个字节写入
标准输出:即0x61
或97
,即字母的ASCII码
a
。
在Swift中,我无法为Character或String类型变量分配整数。
Swift等效的char
是CChar
,Int8
的类型别名:
var alpha: CChar = 97
这是一个不依赖于内存布局的解决方案 也适用于非ASCII字符:
let first: UnicodeScalar = "α"
let last: UnicodeScalar = "ω"
for v in first.value...last.value {
if let c = UnicodeScalar(v) {
print(c, terminator: "")
}
}
print()
// αβγδεζηθικλμνξοπρςστυφχψω