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"
问题是"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 +来调用.
在C++中,编译器正在寻找具有此原型的函数:
T operator+ (const char*, char);
Run Code Online (Sandbox Code Playgroud)
由于没有一个,它无法弄清楚T是什么并且无法解析operator<<调用,因此它回退到唯一的解决方案:指针添加.在Josh的答案中连接到字符串没有问题,因为它存在一个函数.
| 归档时间: |
|
| 查看次数: |
2339 次 |
| 最近记录: |