Gültiges ANSI C?



  • Und C++ und printf?

    und printf ohne stdio.h ?

    1. nicht stdio.h in C++ sondern

    #include <cstdio> 
    
    main() 
    { 
    	printf("Hello, World!");
    }
    

    und 2. sollte das ein beispiel für die main-funktion in C++ sein wie Sie mein
    C++ Buch auch gebraucht.

    Ich weis das für

    printf("");
    

    in C die stdio.h benötigt wird!
    Es ging mir lediglich um den funtionskörper von main.

    mfg hohesC 🕶



  • hohesC schrieb:

    und 2. sollte das ein beispiel für die main-funktion in C++ sein wie Sie mein
    C++ Buch auch gebraucht.

    Das ist aber eher C als C++, denn in C++ nutzt man dafür std::cout. Wenn das so in deinem C++ Buch steht, hast du wahrscheinlich ein relativ schlechtes oder altes.



  • hohesC schrieb:

    #include <cstdio> 
    
    main() 
    { 
    	printf("Hello, World!");
    }
    

    Um...ne, C++ ist das nicht. In C++ musste das int schon explizit vor die main schreiben (ebenso in C99, main() allein haut nur in C89 und Prä-Standard-C hin). Und in C gibts keinen cstdio-header. In C schreibt man also

    #include <stdio.h>
    int main(void) {
      printf("Hello, World!\n"); // oder, besser: puts("Hello, World!");
    }
    

    In C++ dagegen

    #include <cstdio>
    int main() {
      printf("Hello, World!\n");
    }
    

    ...obwohl man in C++ wohl eigentlich doch eher

    #include <iostream>
    using namespace std;
    int main() {
      cout << "Hello, World!" << endl;
    }
    

    schreiben würde.



  • > #include <stdio.h>
    > int main(void) {
    > printf("Hello, World!\n"); // oder, besser: puts("Hello, World!");

    }

    fehlt hier nicht ein return 0; ?



  • @groovemaster es ging mir lediglich um die main funktion

    main()
    {
    }
    

    ich wollte nicht sagen das

    #include <cstdio>
    oder 
    printf("bla,bla");
    

    C++ Standard sind!

    OMG!

    @0xdeadbeef

    // oder, besser: puts("Hello, World!");

    puts(); benutzen nur primitive! fputs(,); ist angebrachter!!!

    und das cout und cin C++ ist weis ich auch!

    mfg hohesC 😃

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        printf("Das ist ANSI C Standard!\n");
        return(0);
    }
    

    [EDIT]@Vertexwahn ja da fehlt return(0);!!![/EDIT]



  • 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 Aberglaube 😃 😃 😃 😃

    EDIT: 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 nur

    int 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.pdf

    fü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


Anmelden zum Antworten