C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

conditional expression - nicht so trivial

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Walther Ypsilanti
Guest





PostPosted: Sun Mar 06, 2005 8:59 pm    Post subject: conditional expression - nicht so trivial Reply with quote



Hallo,

folgender relativ einfacher code-snippet:

for(char c='a';c<='z';c++){
std::cout << c << c=='z' ? std::endl : " ";
}

straightforward, oder? Der compiler(gcc und msvc) peilt es aber nicht!
Anscheinend wegen der höheren präzedenz von <<:es wird std::cout << c< zuerst evaluiert, und das ergebnis(ein ostream), wird im == mit 'z'
verwendet, was natürlich nicht gut gegen kann. Da denke ich gut, für
sowas gibt es Klammern, also:

std::cout << c << (c=='z' ? std::endl : " ");

Damit kann der Kompiler aber auch nix anfangen.

Warum?

Walther

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Moll
Guest





PostPosted: Sun Mar 06, 2005 10:27 pm    Post subject: Re: conditional expression - nicht so trivial Reply with quote



Hallo

Walther Ypsilanti wrote:

Quote:
std::cout << c << (c=='z' ? std::endl : " ");

Damit kann der Kompiler aber auch nix anfangen.

Warum?

Weil die Typen von std::endl und " " nicht zusammenpassen (keins von beiden
läßt sich in das jeweils andere konvertieren).

Du willst vermutlich:

std::cout << c << (c=='z' ? "n" : " ");

Wenn dir das flush aus std::endl wichtig war, geht ja immer noch

std::cout << c << (c=='z' ? "n" : " ") << std::flush;

Gruß
Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Maeder
Guest





PostPosted: Sun Mar 06, 2005 10:27 pm    Post subject: Re: conditional expression - nicht so trivial Reply with quote



Walther Ypsilanti <opllqo2004 (AT) yahoo (DOT) de> writes:

Quote:
for(char c='a';c<='z';c++){
std::cout << c << c=='z' ? std::endl : " ";
}

straightforward, oder?

Ausser wenn 'z' nicht >= 'a' ...


Quote:
Der compiler(gcc und msvc) peilt es aber nicht!

Zurecht.


Quote:
Anscheinend wegen der höheren präzedenz von <<:es wird std::cout
c< 'z' verwendet, was natürlich nicht gut gegen kann. Da denke ich gut,
für sowas gibt es Klammern, also:

std::cout << c << (c=='z' ? std::endl : " ");

Damit kann der Kompiler aber auch nix anfangen.

Warum?

Weil std::endl und " " weder vom gleichen Typ sind noch einer der
beiden Typen in den anderen umgewandelt werden kann. Was spricht gegen

(c=='z' ? 'n' : ' ')

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Sun Mar 06, 2005 10:57 pm    Post subject: Re: conditional expression - nicht so trivial Reply with quote

Walther Ypsilanti wrote:
Quote:
folgender relativ einfacher code-snippet:

for(char c='a';c<='z';c++){
std::cout << c << c=='z' ? std::endl : " ";
}

straightforward, oder? Der compiler(gcc und msvc) peilt es aber nicht!

Das ist ein Typfehler. Der zweite und dritte Operand des ternären
Operators müssen kompatible Typen haben, damit der Gesamtausdruck
('c=='z' ? std::endl : " "') ebenfalls einen Typen haben kann. std::endl
hat den Typ 'ostream(*)(ostream&)', " " hat den Typ 'char[2]', und das
passt offensichtlich nicht.

Wenn du auf das implizite flush verzichten kannst, das dir das endl
gibt, kannst du 'std::cout << (c=='z' ? "n" : " ")' schreiben.
Ansonsten musst du es halt aufdrieseln.

Quote:
Anscheinend wegen der höheren präzedenz von <<:es wird std::cout << c< zuerst evaluiert, und das ergebnis(ein ostream), wird im == mit 'z'
verwendet,

Neee, syntaktisch stimmt das schon, nur halt typmäßig nicht. Auch wenn
ich natürlich die Klammern setzen würde, denn wenn dahinter noch was
käme, wären sie nötig.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Horst Kraemer
Guest





PostPosted: Sun Mar 06, 2005 11:34 pm    Post subject: Re: conditional expression - nicht so trivial Reply with quote

Walther Ypsilanti <opllqo2004 (AT) yahoo (DOT) de> wrote:

Quote:
Hallo,

folgender relativ einfacher code-snippet:

for(char c='a';c<='z';c++){
std::cout << c << c=='z' ? std::endl : " ";
}

straightforward, oder?

Wuerde ich nicht sagen. So programmieren bei uns nur die Ingenieure.
Die Programmierer wuerden

for(char c='a';c<='z';c++)
std::cout << c << " ";
std::cout << endl;

schreiben ;-)

--
Horst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Lukas Mai
Guest





PostPosted: Mon Mar 07, 2005 5:57 am    Post subject: Re: conditional expression - nicht so trivial Reply with quote

Horst Kraemer schrob:
Quote:
Walther Ypsilanti <opllqo2004 (AT) yahoo (DOT) de> wrote:

Hallo,

folgender relativ einfacher code-snippet:

for(char c='a';c<='z';c++){
std::cout << c << c=='z' ? std::endl : " ";
}

straightforward, oder?

Wuerde ich nicht sagen. So programmieren bei uns nur die Ingenieure.
Die Programmierer wuerden

for(char c='a';c<='z';c++)
std::cout << c << " ";
std::cout << endl;

schreiben Wink

Und wer macht sowas?

for (char c = 'a'; c <= 'z'; ++c) {
std::cout << " " + (c == 'a') << c;
}
std::cout << 'n';

Lu:-)kas
--
print+74.117.115.116,,qq.c!..not::.her,Perl=>q$hacker,$,!($,=$")

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rene Moehring
Guest





PostPosted: Mon Mar 07, 2005 8:00 am    Post subject: Re: conditional expression - nicht so trivial Reply with quote

On Sun, 06 Mar 2005 23:27:46 +0100, Thomas Maeder wrote:
Quote:
Walther Ypsilanti <opllqo2004 (AT) yahoo (DOT) de> writes:

for(char c='a';c<='z';c++){
std::cout << c << c=='z' ? std::endl : " ";
}

straightforward, oder?

Ausser wenn 'z' nicht >= 'a' ...


Der compiler(gcc und msvc) peilt es aber nicht!

Zurecht.


Anscheinend wegen der höheren präzedenz von <<:es wird std::cout
c< 'z' verwendet, was natürlich nicht gut gegen kann. Da denke ich gut,
für sowas gibt es Klammern, also:

std::cout << c << (c=='z' ? std::endl : " ");

Damit kann der Kompiler aber auch nix anfangen.

Warum?

Weil std::endl und " " weder vom gleichen Typ sind noch einer der
beiden Typen in den anderen umgewandelt werden kann. Was spricht gegen

(c=='z' ? 'n' : ' ')


Nun, std::endl hat noch ein flush miteingebaut. Es ist semantisch also
nicht exakt identisch.

--
I'm not a racist. I hate everyone equally!

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Mon Mar 07, 2005 11:18 am    Post subject: Re: conditional expression - nicht so trivial Reply with quote

Lukas Mai wrote:

Quote:
Horst Kraemer schrob:
Walther Ypsilanti <opllqo2004 (AT) yahoo (DOT) de> wrote:

Hallo,

folgender relativ einfacher code-snippet:

for(char c='a';c<='z';c++){
std::cout << c << c=='z' ? std::endl : " ";
}

straightforward, oder?

Wuerde ich nicht sagen. So programmieren bei uns nur die Ingenieure.
Die Programmierer wuerden

for(char c='a';c<='z';c++)
std::cout << c << " ";
std::cout << endl;

schreiben ;-)

Und wer macht sowas?

for (char c = 'a'; c <= 'z'; ++c) {
std::cout << " " + (c == 'a') << c;
}
std::cout << 'n';

Wie wäre es mal mit was portablem?

const char* abc = "abcdefghijklmnopqrstuvwxyz";
for (const char* p = abc; *p; ++p)
std::cout << *p << ' ';
std::cout << 'n';

Oder gleich:

const char* abc = "abcdefghijklmnopqrstuvwxyz";
std::cout << abc << 'n';

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.