gpt4 book ai didi

c++ - 为什么在 C++ 中将字符串和字符连接起来会返回一个空字符串?

转载 作者:行者123 更新时间:2023-12-04 14:35:14 24 4
gpt4 key购买 nike

为什么在 C++ 中连接字符串和字符会返回一个空字符串?

#include <iostream>
#include <string>
#include <assert.h>

int main() {
std::string s = "hello" + '4';
assert(s == ""); // why does s equal "" here?
}

最佳答案

问题出在

std::string s = "hello" + '4';
它不会做任何类似于附加 '4' 的远程操作到一个字符串。实际行为与您的期望完全不同。
字符串文字 "hello"表示为 6 个数组 const char , 值 'h' , 'e' , 'l' , 'l' , 'o' , 和 '\0' . (最后一个字符称为终止空值)。
'4'char文字(假设您的编译器使用 ASCII 或兼容字符集,标准不保证)具有 52 的数值.
表达式 "hello" + '4'然后被编译器视为 "hello" + (char)52 . A char是整数类型,所以 "hello" + '4' 的最终结果是指向字符串文字的第 53 个字符的指针(它不存在,因为字符串文字 "hello" 表示为一个包含六个元素的数组)。
所以 "hello" + 4的结果是指向不存在字符的指针。 s的初始化在 std::string s = "hello" + '4';然后将该指针传递给 std::string 的构造函数.该构造函数错误地假设它传递了空终止字符串的第一个字符的地址。这不是传递的内容,因此结果是未定义的行为。
断言 assert(s == "")实际上并不能保证是真的。对于您的编译器和您的主机系统来说,这恰好是真的。但是,由于发生了未定义的行为,任何结果都是可能的(理论上包括在初始化 s 的过程中重新安装操作系统,并且永远不会到达 assert() )。
为了做你想做的事,你需要强制编译器使用 std::string右侧的对象(而不是指针算术)。这样做的一种选择是
 std::string s = std::string("hello") + '4';
这通过构建 std::string 起作用来自文字 "hello" . std:string支持 operator+()可用于连接 charstd::string (并返回一个 std::string 用于初始化 s )。
以上适用于所有 C++ 标准(自 1998 年以来)。第二种选择(自 C++14 起)是使用文字表示法
std::string s = "hello"s + '4';
其工作方式基本相同( s 中的 "hello"s 形成类型为 std::string 的文字,而不是表示为 char 的数组,因此加法的结果也是 std::string )。
事情变成这样的原因是历史性的。

关于c++ - 为什么在 C++ 中将字符串和字符连接起来会返回一个空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68480817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com