Gültiges ANSI C?
-
hohesC schrieb:
ich wollte nicht sagen das
#include <cstdio> oder printf("bla,bla");
C++ Standard sind!
Hättest du aber ruhig machen können, denn das ist es durchaus.
Was ich meinte ist einfach, dass man in einem C-"Hello World!" printf benutzt und in C++ std::cout. Deshalb sieht das Bsp eher nach C als C++ aus.
-
hohesC schrieb:
#include <cstdio> main() { printf("Hello, World!"); }
Dieser Code ist illegal.
Ich weis das für
printf("");
in C die stdio.h benötigt wird!
Es ging mir lediglich um den funtionskörper von main.Auch das ist nicht ganz richtig. Erst seit C99 ist das nötig.
hohesC schrieb:
puts(); benutzen nur primitive! fputs(,); ist angebrachter!!!
Begründung??
@Vertexwahn ja da fehlt return(0);!!!
Nur in C99, in anderen C Standards nicht.
-
Shade Of Mine schrieb:
hohesC schrieb:
puts(); benutzen nur primitive! fputs(,); ist angebrachter!!!
Begründung??
Vielleicht hat er puts() mit gets() verwechselt
-
Der C99 Standard FCD sagt:
5.1.2.2.3 Program termination
[#1] If the return type of the main function is a type
compatible with int, a return from the initial call to the
main function is equivalent to calling the exit function
with the value returned by the main function as its
argument;9) reaching the } that terminates the main function
returns a value of 0. If the return type is not compatible
with int, the termination status returned to the host
environment is unspecified.Also nein, da fehlt kein return 0;.
-
Battelt euch ruhig weiter!
Standard hin und her!wie siehts eigentlich mit
#include <stdio.h> int main() { return(printf("Hallo\n")); }
aus?
Standard oder nicht???
-
hohesC schrieb:
Standard oder nicht???
ich tippe auf 'ja'
edit: aber die klammern beim return kann man weglassen
-
Ich benutze generell fputs(); da den stream selber anzugeben kewler ist!
Wieso sollte ich fgets() mit fputs verwechseln?
naja viel spaß noch!
PS: Jeder Primitivling kann puts(array); benutzen, aber nicht jeder fputs(array,stdout);
Meiner Meinung nach schickt man mit puts(); etwas in die Hölle
ist vielleicht AberglaubeEDIT: schön aber ich schreib die klammern schon immer und daran wird sich nichts ändern.(PUNKT)
-
hohesC schrieb:
Jeder Primitivling kann puts(array); benutzen, aber nicht jeder fputs(array,stdout);
Alles klar...
Dann verzapf sowas bitte auch nicht in einer ernsthaften diskussion, sonst glaubt dir am ende jemand
der code ist uebrigens pedantisch gesehen illegal. praktisch gesehen natuerlich legal.
-
hohesC schrieb:
Ich benutze generell fputs(); da den stream selber anzugeben kewler ist!
Wieso sollte ich fgets() mit fputs verwechseln?das ist nicht dasselbe, puts() schiebt ein '\n' hinterher, fputs() nicht.
Shade Of Mine schrieb:
der code ist uebrigens pedantisch gesehen illegal.
warum?
-
der code ist uebrigens pedantisch gesehen illegal. praktisch gesehen natuerlich legal.
0000 M M GGGGG 0 0 MM MM G 0 0 M M M M G GGGG 0 0 M M M M G G 0000 M M M GGGGG
MAN BIN ICH HEUTE GUT DRAUF
danke fuer euer verstaendnis!
mfg hoehesC
EDIT: das soll keinen beleidigen!
-
net schrieb:
Shade Of Mine schrieb:
der code ist uebrigens pedantisch gesehen illegal.
warum?
wurde schon gesagt hier:
legal ist nurint main(void) int main(int argc, char* argv[])
int main() ist somit nicht legal.
aber nur pedantisch gesehen, denn ich schreibe nie "int main(void)" und den compiler will ich sehen, der hier einen fehler meldet...
-
> int main()
das void sollte man nicht weglassen weil eine leere Klammer in C99 ein beliebige Anzahl von Parametern bedeutet
in C++98 bedeutet ein leere Klammer das gleiche wie void
Gerade gefunden ISO/IEC 9899:1990:
http://www.nirvani.net/docs/ansi_c.pdffür leute die sich gar nicht mehr auskennen:
"The C programming language began to be standardized some time around 1985 by the ANSI X3J9 committee. Several years of effort went by, and in 1989 ANSI approved the new standard. An ISO committee ratified it a year later in 1990 after adding an amendment dealing with internationalization issues. The 1989 C standard is known officially as ANSI/ISO 9899-1989 [der 1989 C Standard wird auch oft als C89 bezeichnet]. The 1990 ISO revision of the standard is known officially as ISO/IEC 9899-1990, Programming Languages - C, which is often called "C90".The next version of the C standard was ratified by ISO in 1999. Officially know as ISO/IEC 9899-1999, Programming Languages ("C99").
The C++ programming language was based on the C programming language as it existed shortly after the ANSI C standardization effort had begun. Around 1995 an ISO committee was formed to standardize C++, and the new standard was ratified in 1998, which is officially known as ISO/IEC 14882-1998, Programming Languages - C++. ("C++98")."
vielleicht sollte man das in die FAQ packen - zu dem Thema was C überhaupt ist, damit man hier mal auf einen gemeinsamen nenner kommt
BTW: http://courses.iicm.edu/the_c_book/SoftwareentwicklungInC.pdf
Kostenloses Buch zur C Programmierung, weicht an manchen stellen vom Standard ab, dürfte aber für Anfänger recht interessant sein@Shade Of Mine:
unter http://tutorial.schornboeck.net/switch.htm
steht folgendes:
"switch hat nur einen Nachteil: da eine Sprungtabelle berechnet wird, kann
man nur int Typen sowie char bei einem switch verwenden."Bei switch Anweisungen sind außerdem bool, wchar_t, long, Aufzählungen
(enum) und Bitfelder erlaubt. (Alle integralen Datentypen)Vielleicht könnte man das noch irgendwo als Anmerkung beifügen
-
hohesC schrieb:
#include <stdio.h> int main() { return(printf("Hallo\n")); }
Das ist zwar standardkonformer Code, macht aber auf eine subtile Weise nicht das, was du willst. Es ist Konvention, dass ein Programm bei erfolgreichem Ablauf nachher 0 zurückgeben sollte, was dann von der Shell abgeprüft und z.B. in Skripten benutzt werden kann. printf jedoch gibt die Anzahl der geschriebenen Zeichen zurück, also wird dieses Programm höchstens dann 0 zurückgeben, wenn irgendetwas richtig schief gelaufen ist.
-
hohesC schrieb:
#include <stdio.h> int main() { return(printf("Hallo\n")); }
In diesem Fall das Programm genau das umgekehrte, was es tun soll
Bitte, sowas NIE tun.
-
supertux schrieb:
hohesC schrieb:
#include <stdio.h> int main() { return(printf("Hallo\n")); }
In diesem Fall das Programm genau das umgekehrte, was es tun soll
Bitte, sowas NIE tun.gibts kein 'hallo' aus?
mehr solls ja nicht tun
-
Angenommen die ausführbare Datei heißt hallo und ich schreibe ein Skript, welches Hallo\n schreibt und wenn das Programm fehlerfrei beendet hat, dann führer ich das xyz Programm aus. Aber xyz soll nur dann ausgeführt werden, wenn 'hallo' fehlerfrei beendet hat.
#!/bin/bash (hallo && xyz) || echo "Fehler!"
Mit so einem Code bekomme ich "Fehler!", obwohl es gar keinen gibt. Deshalb sollte man sowas nicht tun.
-
hohesC schrieb:
EDIT: schön aber ich schreib die klammern schon immer und daran wird sich nichts ändern.(PUNKT)
Sag niemals nie.
Ich hab auch lange Zeit die Klammerung benutzt, mittlerweile lass ich sie weg. Zum einen sparst du dir damit Schreibarbeit (immerhin ein Zeichen pro return Anweisung
), und zum anderen siehts einfach cleaner aus.
-
groovemaster schrieb:
Zum einen sparst du dir damit Schreibarbeit (immerhin ein Zeichen pro return Anweisung
), und zum anderen siehts einfach cleaner aus.
Und wichtigestes Argument:
folgendes ist legaler C Code:
int main() { retrun(printf("foo\n")); }
liefert blöde linker fehler - was bdeutet, man muss wegen dem tippfehler neukompilieren (sonst wäre der fehler beim kompilieren aufgefallen und hätte damit garnicht erst durchkompiliert) - manchmal linkt man auch nicht gleich und der fehler versteckt sich länger.
natürlich ist es dennoch kein problem so einen fehler zu entdecken - ich wollte nur auch ein vernünftiges argument bringen. statt "sieht besser aus, weniger tiparbeit, ist 13373R" oder sonstwas
-
> folgendes ist legaler C Code
ist es nicht - wo steht das in C99?
das void sollte man nicht weglassen weil eine leere Klammer in C99 ein beliebige Anzahl von Parametern bedeutet
oder liege ich da jetzt falsch
-
Wenn mans ganz genau nimmt, verbietet C99 den Code nicht direkt. Allerdings ist int main() keine der vom Standard garantierten Formen für main. Ein Compiler kann das also durchaus ablehnen und trotzdem standardkonform sein - insofern ist es sinnvoller, int main(void) zu schreiben.
Allerdings gehe ich stark davon aus, dass die meisten, wenn nicht alle, C-Compiler int main() annehmen.