Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   [n00b] Order of strings generates error (http://www.velocityreviews.com/forums/t459571-n00b-order-of-strings-generates-error.html)

Charles 01-02-2007 01:36 AM

[n00b] Order of strings generates error
 
I am learning from the Accelerated C++ book. The following example
doesn't work and I don't know why:

#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;
return 0;
}


But if I invert strings, it works:


#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = ", world" + exclam + "Hello";
return 0;
}

Unfortunately there's no explanation why. Could you tell me please?
Thanks.


red floyd 01-02-2007 02:10 AM

Re: [n00b] Order of strings generates error
 
Charles wrote:
> I am learning from the Accelerated C++ book. The following example
> doesn't work and I don't know why:
>
> #include <iostream>
> #include <string>
> int main () {
> const std::string exclam = "!";
> const std::string message = "Hello" + ", world" + exclam;
> return 0;
> }
>
>
> But if I invert strings, it works:
>
>
> #include <iostream>
> #include <string>
> int main () {
> const std::string exclam = "!";
> const std::string message = ", world" + exclam + "Hello";
> return 0;
> }
>
> Unfortunately there's no explanation why. Could you tell me please?
> Thanks.
>


+ associates left to right. So in your first case, you are trying to
add two string literals (char arrays) together, and then add the
exclamation point. There is no operator+ which takes two const char *'s
as parameters.

In the second case, you are "adding" a string literal to a std::string,
and there is an operator+(const char*, const std::string&) defined,
which returns a std::string, so then you add another string literal to
the returned string, using operator+(const std::string&, const char *).


Charles 01-02-2007 02:57 AM

Re: [n00b] Order of strings generates error
 

red floyd escreveu:
> + associates left to right. So in your first case, you are trying to
> add two string literals (char arrays) together, and then add the
> exclamation point. There is no operator+ which takes two const char *'s
> as parameters.
>
> In the second case, you are "adding" a string literal to a std::string,
> and there is an operator+(const char*, const std::string&) defined,
> which returns a std::string, so then you add another string literal to
> the returned string, using operator+(const std::string&, const char *).


Ah ok, thank you!


Ron House 01-02-2007 03:10 AM

Re: [n00b] Order of strings generates error
 
Charles wrote:
> I am learning from the Accelerated C++ book. The following example
> doesn't work and I don't know why:


What do you mean "doesn't work"??? Compiler error? What is it? Runtime
error, wrong output, what? If you want help, please write a coherent
account of your problem. Putting "n00b" in the title is not an excuse
for laziness, only for ignorance.

> #include <iostream>
> #include <string>
> int main () {
> const std::string exclam = "!";
> const std::string message = "Hello" + ", world" + exclam;
> return 0;
> }


But luckily, the problem is obvious. The + operator is left-associative.
Putting + between two C-style literals is attempting to call the
(nonexistent) operator that adds two char pointers. The above could be
fixed by writing:

"Hello" + (", world" + exclam);

--
Ron House house@usq.edu.au
http://www.sci.usq.edu.au/staff/house

Jim Langston 01-02-2007 03:52 AM

Re: [n00b] Order of strings generates error
 
"Ron House" <house@usq.edu.au> wrote in message
news:4599CD12.80907@usq.edu.au...
> Charles wrote:
>> I am learning from the Accelerated C++ book. The following example
>> doesn't work and I don't know why:

>
> What do you mean "doesn't work"??? Compiler error? What is it? Runtime
> error, wrong output, what? If you want help, please write a coherent
> account of your problem. Putting "n00b" in the title is not an excuse for
> laziness, only for ignorance.
>
>> #include <iostream>
>> #include <string>
>> int main () {
>> const std::string exclam = "!";
>> const std::string message = "Hello" + ", world" + exclam;
>> return 0;
>> }

>
> But luckily, the problem is obvious. The + operator is left-associative.
> Putting + between two C-style literals is attempting to call the
> (nonexistent) operator that adds two char pointers. The above could be
> fixed by writing:
>
> "Hello" + (", world" + exclam);


You know, this question comes up quite a bit, and it even bit me a few times
til I fugred it out. I believe that in C and C++ adding two pointers is
undefined behavior. You can add an int to a pointer, but not a pointer to a
pointer. So, I've been thinking, would it make sense to make an
operator+(const char*, const char*) that would return a std::string? What
would be the drawbacks to this (other than the possible difficulty of
implementing it).




Ivan Novick 01-02-2007 07:56 AM

Re: [n00b] Order of strings generates error
 

Jim Langston wrote:
> You know, this question comes up quite a bit, and it even bit me a few times
> til I fugred it out. I believe that in C and C++ adding two pointers is
> undefined behavior. You can add an int to a pointer, but not a pointer to a
> pointer. So, I've been thinking, would it make sense to make an
> operator+(const char*, const char*) that would return a std::string? What
> would be the drawbacks to this (other than the possible difficulty of
> implementing it).


Can you give an example where this functionality would be practical to
use? The example given above is not a good use case because you can
just do the following and the string literals will be concatenated
without having to construct an object:

std::string one = "Santa";
std::string two = "Hello World " "from " + one;

----
Ivan
http://www.0x4849.net


Roland Pibinger 01-02-2007 08:51 AM

Re: [n00b] Order of strings generates error
 
On Tue, 02 Jan 2007 13:10:10 +1000, Ron House wrote:
>Charles wrote:
>> I am learning from the Accelerated C++ book. The following example
>> doesn't work and I don't know why:

>
>> #include <iostream>
>> #include <string>
>> int main () {
>> const std::string exclam = "!";
>> const std::string message = "Hello" + ", world" + exclam;
>> return 0;
>> }

>
>But luckily, the problem is obvious.


The problem is obviously not obvious for someone who learns C++ from
"Accelerated C++".


All times are GMT. The time now is 10:14 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.