C++ 中 char l[] {'try'} 和 char l[] {'t', 'r', 'y'} 有什么区别?

1 c++ arrays char literals list-initialization

当我试图计算它们时

char l[] {'t', 'r', 'y'};
std::cout << l << std::endl;
Run Code Online (Sandbox Code Playgroud)

我尝试在终端中打印。然而,当我尝试这样做时。

char l[] {'try'};
Run Code Online (Sandbox Code Playgroud)

我只得到了y。

我从 python 转向 c++,所以很多事情对我来说没有意义,所以你能解释一下这两个表达式的区别吗?

Ted*_*gmo 5

你的例子都无效。

  • 第一个具有未定义的行为
    char l[] {'t', 'r', 'y'};
    std::cout << l << std::endl;
    
    Run Code Online (Sandbox Code Playgroud) 在这里您定义l为一个char[3]. 没关系。然而,不像您那样打印它,因为operator<<您使用的重载需要一个以 null 结尾的字符串。您的char[3]不是空终止符,因此operator<<重载将尝试找到越界的空终止符,这会导致未定义的行为。一个可行的变体是
    char l[] {'t', 'r', 'y', '\0'};
    
    Run Code Online (Sandbox Code Playgroud) 这将使其末尾char[4]带有(空终止符)。\0
  • 第二个示例尝试从多字节字符创建数组。单引号用于单个字符,因此这就是解释不起作用的原因。许多编译器会简单地拒绝编译它。要从字符串文字创建数组,请使用双引号:
    char l[] {"try"};
    
    Run Code Online (Sandbox Code Playgroud) 或者惯用的方式:
    char l[] = "try";
    
    Run Code Online (Sandbox Code Playgroud) 两个版本都会创建一个以 null 结尾的数组,就像char l[] {'t', 'r', 'y', '\0'};