Gültiges ANSI C?
-
> 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.
-
wollte nur darauf hinaus das in C99 int main(void) und int main() etwas anderes ist
in C++98 ist es gleichwertig