 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Walther Ypsilanti Guest
|
Posted: Sun Mar 06, 2005 8:59 pm Post subject: conditional expression - nicht so trivial |
|
|
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
|
Posted: Sun Mar 06, 2005 10:27 pm Post subject: Re: conditional expression - nicht so trivial |
|
|
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
|
Posted: Sun Mar 06, 2005 10:27 pm Post subject: Re: conditional expression - nicht so trivial |
|
|
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
|
Posted: Sun Mar 06, 2005 10:57 pm Post subject: Re: conditional expression - nicht so trivial |
|
|
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
|
Posted: Sun Mar 06, 2005 11:34 pm Post subject: Re: conditional expression - nicht so trivial |
|
|
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
|
Posted: Mon Mar 07, 2005 5:57 am Post subject: Re: conditional expression - nicht so trivial |
|
|
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
|
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
|
Posted: Mon Mar 07, 2005 8:00 am Post subject: Re: conditional expression - nicht so trivial |
|
|
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
|
Posted: Mon Mar 07, 2005 11:18 am Post subject: Re: conditional expression - nicht so trivial |
|
|
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 |
|
 |
|
|
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
|
|