字符串文字和字符文字可以连接吗?

yes*_*aaj 4 c# c++ java string char

为什么name在以下C++代码中行为不端?

string name =  "ab"+'c';
Run Code Online (Sandbox Code Playgroud)

等效代码在Java/C#中的行为如何?

Ecl*_*pse 13

尝试

std::string name = "ab" "c";
Run Code Online (Sandbox Code Playgroud)

要么

std::string name = std::string("ab") + c;
Run Code Online (Sandbox Code Playgroud)

在C++中,"ab"不是a std::string,而是指向字符串的指针.向指针添加整数值时,会得到一个新指针,指向字符串的下方:

char *foo = "012345678910121416182022242628303234";
std::string name = foo + ' '; 
Run Code Online (Sandbox Code Playgroud)

name被设置为"3234",因为''的整数值是32,并且在foo开头之后的32个字符是字符串结尾之前的四个字符.如果字符串较短,您将尝试访问未定义内存区域中的内容.

解决方法是从字符数组中生成一个std:string.std:strings允许您按预期将字符追加到它们:

std::string foo = "012345678910121416182022242628303234";
std::string name = foo + ' '; 
Run Code Online (Sandbox Code Playgroud)

name 设置为"012345678910121416182022242628303234"


jal*_*alf 8

问题是"ab"不是C++ std::string,而是a const char[3].所以它正在寻找的+运营商是operator+ (const char[3], char).这不存在,因此编译器会尝试让数组衰减到指针,因此它会查找operator+ (const char*, char).这是存在的,所以编译器会选择它,但它做错了.将一个整数值(char)添加到指针(const char*)是一个很常见的操作,显然,这就是这个operator +的作用.理解这一点的关键是要意识到第一个参数是1)一个数组,2)每当数组没有意义时的指针.它在C中也被用作字符串,是的,但它不是字符串.它是一个指针(或偶尔,一个数组).

有一个operator+ (const std::string&, char)连接,但编译器甚至不会查找它,因为第一个参数不是std :: string.

所以解决方案是手动创建字符串:

string name = std::string("ab")+'c';
Run Code Online (Sandbox Code Playgroud)

现在编译器可以找出正确的operator +来调用.


gre*_*ade 5

在C++中,编译器正在寻找具有此原型的函数:

T operator+ (const char*, char);
Run Code Online (Sandbox Code Playgroud)

由于没有一个,它无法弄清楚T是什么并且无法解析operator<<调用,因此它回退到唯一的解决方案:指针添加.在Josh的答案中连接到字符串没有问题,因为它存在一个函数.