C 字符串和十六进制字符

C string and hex characters

谁能解释这段代码中发生了什么?

    #include <stdio.h>

    void f(const char * str) {
      printf("%d\n", str[4]);
    }

    int main() {
      f("\x03""www""\x01""a""\x02""pl");
      f("\x03www\x01a\x02pl");
      return 0;
    }

为什么输出是?

    1
    26

在 C 中,以十六进制指定的字符(如 "\x01")可以有两位以上的数字。在第一种情况下,"\x01""a" 是字符 1,后面是 'a'。第二种情况,"\x01a",就是字符0x1a,也就是26.

问题在于 "\x01""a""\x01a",以及十六进制 -> 字符转换和字符串连接发生在词法处理的不同阶段这一事实。

在第一种情况下,十六进制字符在连接之前被扫描和转换 字符串,因此第一个字符被视为 \x01。然后 "a" 是 串联,但 hex->char 转换已经执行, 连接后不会重新扫描,所以你会得到两个字母 \x01a.

在第二种情况下,扫描仪将 \x01a 视为单个字符, 使用 ASCII 码 26.