代码之家  ›  专栏  ›  技术社区  ›  Cyril Troian

快速解释字母表

  •  1
  • Cyril Troian  · 技术社区  · 7 年前

    我无意中编写了以下简单代码来在终端中打印字母表:

    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中,我无法将整数赋给字符或字符串类型的变量。我使用了Integer,然后声明了几个变量来分配UnicodeScalar,但我无意中发现,当我调用write时,我指向的是我的Integer,而不是UnicodeScalar类型的新变量,尽管它可以工作!代码很短,可读性很强,但我不完全理解它是如何工作的以及为什么。

    有人有过这种情况吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Martin R    7 年前

    为什么它会起作用?

    这是偶然发生的,因为整数是以小端字节顺序存储的。 整数 97 以8字节的形式存储在内存中

    0x61 0x00 0x00 0x00 0x00 0x00 0x00 0x00
    

    并且在 write(1, &alpha, 1) ,该内存位置的地址为 传递给 write 系统调用。自上一个参数以来( nbyte ) 为1,则该内存地址的第一个字节写入 标准输出:即 0x61 97 ,字母的ASCII码 a

    但在Swift中,我无法将整数赋给字符或字符串类型的变量。

    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()
    
    // αβγδεζηθικλμνξοπρςστυφχψω
    
    推荐文章