2013-04-16 183 views
0

我已经阅读了许多文章,为什么两个字符串文字不能在C++等中添加,并且运算符+支持将字符串文字添加到整数。连接两个字符串

不过,我想了解在下面的代码编译器错误:

string str1, str2, str3; 
int i = 10; 

str1 = "Hello " + i; 
str2 = i + "Mars"; 
str3 = "Hello " + i + "Mars"; 

初始化的str1str2工作正常,但str3建设提供了以下错误:

example.cpp: In function int main() :
example.cpp:20:27: error: invalid operands of types const char* and const char [5] to binary operator+

Q1:在错误信息中,我明白const char [5]指的是"Mars"const char*是指什么,整数i转换为char *后?

Q2:operator+已从左向右关联,我猜的str3建设可以写为:

str3 = ("Hello " + i) + "Mars"; 

是否("Hello " + i)计算为char *

Q3:在下面的代码:

str5 = string("foo ") + "bar "; 
str6 = string("foo ") + "bar " + i; 

str5设置编译罚款,但str6生成错误消息的负载(页半)。 string("foo ") + "bar "的结果如何?是"string"

在此先感谢您的任何见解。

+2

您尝试添加一个字符串和一个整数。这是错误。考虑:http://stackoverflow.com/questions/5590381/easiest-way-to-convert-int-to-string-in-c – squiguy

回答

7

str1获取字符串文字(真正是一个常量字符数组),将其衰减为指向第一个字符的指针,并将十个指针添加到该指针,导致const char *超出字符串字面值,这是未定义的行为,因为它超越了结尾。

str2str1的功能相同,但更进一步超越界限。

str3确实与"Hello"i同样的事情,然后尝试将所得const char *添加到其它字符串文字(再次,恒定字符数组,这是由于被传递给函数,以衰减)。有operator+没有超载,将需要const char *const char *,因此你会得到错误。

请注意,这些都不会按照您的要求工作。那些编译的是未定义的行为。 std::string已超载operator+以适应其目的,因此将字符串文字添加到std::string只是将其连接起来。要添加一个整数是有点暧昧,虽然(因此不operator+支持),所以你必须让你的意图明确将其转换为字符串第一:

str6 = string("foo ") + "bar " + std::to_string(i); 
1

事情是,“你好”的文字被视为一个字符*。你可以通过向它添加一个int来对char *进行指针运算 - 你在说“超出char *指向的10个字符”。换句话说,垃圾。

总之,你需要使用boost :: lexical_cast或istringstream来处理这种事情。

+0

好吧,我只是注意到,当我打印“你好”+ 10,它不是“你好”+“10”,但正如你所指出的那样,这个值是垃圾。谢谢。 –

+1

@AhmedA尝试'std :: cout <<(“Hello”+ 1)<< std :: endl;'以更清楚地了解发生了什么。 –

3

Q1: In the error message, I understand const char [5]' refers to "Mars". What doesconst char*' refer to, the integer i after conversion to a "char *"?

它指的是"Hello" + i的结果。

Q2: operator+ has left-to-right associativity, I am guessing the construction of str3 can be written as: str3 = ("Hello " + i) + "Mars";

Does ("Hello " + i) evaluate to a char *?

是的。但它的评估结果为const char*

Q3: What is the outcome of string("foo ") + "bar ", is it a "string"?

是的,这是一个std:string。您在str6 = string("foo ") + "bar " + i;中发生错误,因为您无法添加字符串和整数。

旁注 - 没有以下三个条件中的iniatialization:

str1 = "Hello " + i; 
str2 = i + "Mars"; 
str3 = "Hello " + i + "Mars"; 

他们都调用赋值运算符。

+0

然而,将字符串文字添加到整数是有效的(正如我在主帖子中设置str1所看到的)。我很好奇,至于为什么没有实现,向一个整数添加一个字符串。 –

+2

@AhmedA,对于'std :: string',你是否想增加它的长度?连接号码?添加具有该数值的字符?它作为一个独立的操作真的更好。至于文字,它需要进行必要的指针运算。 – chris

+0

@AhmedA它是有效的,但只有当你不增加超过文字的长度时(见克里斯的帖子)。它不会进行连接,但是它会将指针递增到文字。 – jrok