printf() "schneller" als cout<<?
-
Biks schrieb:
@otze
das kann gut sein, wir haben an der hochschule halt keine anderen. für lehr- und lernzwecke scheint es auszureichen. bei professionellen anwendungen mögen die grenzen heutzutage schnell erreicht sein.hier gehts nicht um professionalität sondern um richtigkeit.
ein #include <iostream.h> oder void main(){} ist schlichtweg falsch.dazu kommt noch, dass man zb den MinGW kostenlos bekommt, und der eigentlich neueeste technologien bietet, wer brauch da noch vc++ 6.0?
-
otze schrieb:
hier gehts nicht um professionalität sondern um richtigkeit.
ein #include <iostream.h> oder void main(){} ist schlichtweg falsch.aja? also das interessiert mich jetzt näher. wieso sollte das falsch sein?
warum muss das immer so kompliziert sein??? wieso kann eine textausgabe nicht entweder printf() ODER cout<< sein? warum müssen beide existieren? und wieso sagst du, dass das was funktioniert falsch ist? und wie erkläre ich das meinem prof?
kann es sein, dass ich standard C versuche zu programmieren und du von richtigem C++ redest? wie schon gesagt, ich orientiere mich lediglich an meiner lehrveranstaltung. wenn mir da was wirklich falsches beigebracht wird, dann bin ich natürlich für die richtigen wege offen.
-
Biks: http://tutorial.schornboeck.net/groessten_luegen.htm
btw, printf ist C und cout ist C++, printf ist aber (da C eine Teilmenge von C++ bildet) auch in C++ enthalten; verwenden solltest Du im Regelfall aber eher die C++-Streamfunktionalität.
-
Den Header den du verwendest hat eigentlich jeder Compiler, da er noch aus der Zeit vor dem C++-Standard kommt und damals "inoffizieller" Standard war.
Das void main() hat sich wohl irgendwanneinmal eingeschlichen und viele Compiler akzeptieren es, es ist jedoch weder Konform zum C noch zum C++-Standard, aber _falsch_ ist es nicht, außer hier im ISO-C++ Forum, oder im ANSI-C Forum.
Aber jeder hat das Recht alle Features zu nutzen die der Compiler/Bibliothek bietet, nur wird man dadurch eben etwas unabhängiger.
Jedoch solltest du die Sprache schon so verwenden wie es der Standard vor sieht.
-
warum muss das immer so kompliziert sein??? wieso kann eine textausgabe nicht entweder printf() ODER cout<< sein? warum müssen beide existieren? und wieso sagst du, dass das was funktioniert falsch ist? und wie erkläre ich das meinem prof?
Also es gibt zwei Möglichkeiten:
(1) Der Herr Professor erklärt seinem Student den Unterschied zwischen C und C++ und die Bedeutung des C++-Standards von 1998(!das müsste sich auch schon an den Unis rumgesprochen haben!).
(2) Du informierst dich selbst (der bessere Weg):
http://www.cpp-tutor.de/cpp/toc.htm
http://tutorial.schornboeck.net/inhalt.htm
http://www.volkard.de/C++/Tutorial/Grundlagen/
http://de.geocities.com/throni3/cpp/Inhalt.html
http://www.henkessoft.de/cpp_konsole.htmMan sollte cout und printf nicht mischen, da beide verschiedene Puffer verwenden und nicht gut zusammen passen. Es kann aber auch gut gehen.
Nachfolgend ein C++-Programm mit drei Schleifentypen (for, while, do/while) und cout / printf:
#include <iostream> #include <cstdio> using namespace std; int main() { for(int i=0; i<10; ++i) { cout << "Erste Schleife: " << i << endl; printf("Erste Schleife: %d\n",i); } int j=0; while(j<10) { ++j; cout << "Zweite Schleife: " << j << endl; printf("Zweite Schleife: %d\n",j); } int k=0; do { ++k; cout << "Dritte Schleife: " << k << endl; printf("Dritte Schleife: %d\n",k); } while(k<10); cin.get(); }
Wenn dein Compiler das nicht versteht, verwende einen standardkonformen. Es gibt genügend kostenlose Compiler/Linker bzw. IDE's. Ich empfehle Dev-C++ (aktuell: 4.9.9.10) für Konsolenprogramme.
-
Der C++-Standard definiert genau zwei gültige Signaturen für main, nämlich
int main() { /* ... */ } // In C99 schreibt man int main(void) statt int main() int main(int argc, char *argv[]) { /* ... */ }
Alles andere ist schon deswegen völliger Bockmist. In der Praxis funktioniert void main trotzdem oft, aber es gibt durchaus Fälle, in denen dir das das Genick bricht. Der gcc akzeptiert es deswegen auch ab Version 3.4 nicht mehr.
-
Erhard Henkes schrieb:
Man sollte cout und printf nicht mischen, da beide verschiedene Puffer verwenden und nicht gut zusammen passen. Es kann aber auch gut gehen.
Der Standard schreibt vor, dass beide Puffer synchronisiert sind. Es gib also in einer konformen Implementierung keine Probleme. Man kann die Puffer jedoch bei Bedarf trennen. Siehe: §27.4.2.4
-
SirLant schrieb:
Das void main() hat sich wohl irgendwanneinmal eingeschlichen und viele Compiler akzeptieren es, es ist jedoch weder Konform zum C noch zum C++-Standard, aber _falsch_ ist es nicht, außer hier im ISO-C++ Forum, oder im ANSI-C Forum.
In den bereits verabschiedeten C-Standards (C89 und C99) ist void main meines Wissens noch nicht einmal explizit verboten. Vielmehr meine ich mich zu erinnern, dass es implementationsspzifische main-Funktionen geben darf.
-
C89 ist da recht liberal, C99 dagegen erlaubt nur
int main(void); // _nicht_ int main(), das ist entgegen der landläufigen Meinung ein Unterschied int main(int argc, char *argv[]);
...das heißt, wenn ich mich grad nicht sehr irre.
-
0xdeadbeef schrieb:
Der gcc akzeptiert es deswegen auch ab Version 3.4 nicht mehr.
Eigentlich geht das sogar schon länger nicht mehr, ich kann Dir jetzt keine genauen Versionsnummern nennen, aber ich habe noch immer einen 3.3er g++ und der mag das schon nicht mehr.
-
0xdeadbeef schrieb:
C89 ist da recht liberal, C99 dagegen erlaubt nur
int main(void); // _nicht_ int main(), das ist entgegen der landläufigen Meinung ein Unterschied int main(int argc, char *argv[]);
...das heißt, wenn ich mich grad nicht sehr irre.
In C++ ist ein void func(void) gleichbedeutend mit void func()!
-
In C++ schon, in C aber nicht.
-
MaSTaH schrieb:
net schrieb:
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
Ach? Was kann ich denn mit printf machen was ich mit cout nicht machen kann?
printf ist etwas schneller. und...
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, sieht aber schlimm aus mit den ganzen setiosflags() da drin
-
-
net schrieb:
MaSTaH schrieb:
net schrieb:
btw: printf ist eh' besser als cout. es kann besser die ausgaben formatieren
Ach? Was kann ich denn mit printf machen was ich mit cout nicht machen kann?
printf ist etwas schneller. und...
Unwichtig! Wenn ich Zeit habe eine Konsolenausgabe zu machen, dann darf es mir um die ms auch nicht ankommen. Ausserdem glaube ich, dass der Performancegewinn nur theoretisch ist.
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, sieht aber schlimm aus mit den ganzen setiosflags() da drinSo etwas sieht mit cout in der Tat gruselig aus. Nun muss man sich aber fragen, wie oft man so etwas braucht und, ob einem typensicherheit nicht wichtiger ist.
Gruß,
Christian
-
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
#include <iomanip> #include <iostream> int main() { std::cout << std::setw(8) << std::setfill('0') << std::setprecision(2) << std::fixed << 1.2345 << ' ' << std::setprecision(7) << std::fixed << 3.4 << ' ' << std::scientific << 5.6 << ' ' << std::hex << std::showbase << -1 << std::endl; }
-
MaSTaH schrieb:
Unwichtig! Wenn ich Zeit habe eine Konsolenausgabe zu machen, dann darf es mir um die ms auch nicht ankommen. Ausserdem glaube ich, dass der Performancegewinn nur theoretisch ist.
er ist messbar, also real. theoretisch ist cout schneller, aber praktisch ist printf schneller.
aber nicht viel in beiden richtungen.
wenn man selber scrollt, statt das bs scrollen zu lassen, ist man wesentlich schneller als printf und cout. falls jemand speed will, soll er also bestimmt nicht aufs lustige printf umsteigen, wenn er mit nem cout-replacement wahnsinnige speed riegen würde.
-
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, sieht aber schlimm aus mit den ganzen setiosflags() da drin// ausgabe: coredump/schutzverletzung printf("%08.2f %.7f %s %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, aber man müßte schon gehirnoperiert sein, cout<<static_cast<char*>(0); zu schreiben.
-
Jojo, die ultrakrasse 3D-Grafik in einer Konsole muss schon performant sein.
0xdeadbeef schrieb:
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
#include <iomanip> #include <iostream> int main() { std::cout << std::setw(8) << std::setfill('0') << std::setprecision(2) << std::fixed << 1.2345 << ' ' << std::setprecision(7) << std::fixed << 3.4 << ' ' << std::scientific << 5.6 << ' ' << std::hex << std::showbase << -1 << std::endl; }
Da gefällt mir die cout-Lösung wesentlich besser. printf ist C ohne ++. Fertig. :p
-
volkard schrieb:
// ausgabe: coredump/schutzverletzung printf("%08.2f %.7f %s %p\n", 1.2345, 3.4, 5.6, -1);
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)