Programmiersprache C/C++

Beispielfolge 5

Variationen von "Hello, World"


Version 1:
Das klassische "Hello, World" in ANSI C Syntax:

  #include <stdio.h>

  int main(void)
  {
    printf("Hello, World\n");

    return 0;
  }

Version 1a:
Variation der klassischen Version:

  #include <stdio.h>

  int main(void)
  {
    fprintf(stdout, "Hello, World\n");

    return 0;
  }
Im Vergleich zur Version 1:
Verwendung der allgemeineren Ausgabefunktion fprintf anstelle von printf.


Version 2:
Variation der klassischen Version:

  #include <stdio.h>

  int main(void)
  {
    puts("Hello, World");

    return 0;
  }
Im Vergleich zur Version 1:
Verwendung der spezielleren Ausgabefunktion puts anstelle von printf.


Version 2a:
Variation der klassischen Version:

  #include <stdio.h>

  int main(void)
  {
    fputs("Hello, World\n", stdout);

    return 0;
  }
Im Vergleich zur Version 2:
Verwendung der allgemeineren Ausgabefunktion fputs anstelle von puts.


Version 3:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char msg[13] = 
      { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '\n' };
    int i;

    for ( i=0; i<13; i++ )
      putchar(msg[i]);

    return 0;
  }

Version 3a:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char msg[13] =
         { 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 10 };
    int i;

    for ( i=0; i<13; i++ )
      putchar(msg[i]);

    return 0;
  }
Im Vergleich zur Version 3:
Angabe der Zeichen durch ihren ASCII-Wert in Dezimaldarstellung.
Eingeschränkte Portabilität durch Abhängigkeit vom ASCII-Zeichensatz.


Version 3b:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char msg[13] =
       { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20,
         0x57, 0x6f, 0x72, 0x6c, 0x64, 0x0a };
    int i;

    for ( i=0; i<13; i++ )
      putchar(msg[i]);

    return 0;
  }
Im Vergleich zur Version 3:
Angabe der Zeichen durch ihren ASCII-Wert in Hexadezimaldarstellung.
Eingeschränkte Portabilität durch Abhängigkeit vom ASCII-Zeichensatz.


Version 3c:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char msg[13] =
       { 0110, 0145, 0154, 0154, 0157, 054, 040,
         0127, 0157, 0162, 0154, 0144, 012 };
    int i;

    for ( i=0; i<13; i++ )
      putchar(msg[i]);

    return 0;
  }
Im Vergleich zur Version 3:
Angabe der Zeichen durch ihren ASCII-Wert in Oktaldarstellung.
Eingeschränkte Portabilität durch Abhängigkeit vom ASCII-Zeichensatz.


Version 3d:
Ausgabe von "Hello, World" als Zeichenkette

  #include 

  int main(void)
  {
    char msg[] = "Hello, World";

    puts(msg);

    return 0;
  }

Version 3e:
Ausgabe von "Hello, World" als 'codierte' Zeichenkette

  #include 

  int main(void)
  {
    char msg[] =
      { 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 0 };

    puts(msg);

    return 0;
  }
Im Vergleich zur Version 3:
Angabe der Zeichen durch ihren ASCII-Wert in Dezimaldarstellung.
Die Angabe einer abschließenden Null erlaubt die Behandlung als Zeichenkette (String).


Version 3f:
Ausgabe von "Hello, World" als 'codierte' Zeichenkette

  #include <stdio.h>

  int main(void)
  {
    char msg[] = "\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x0a";

    puts(msg);

    return 0;
  }
Im Vergleich zur Version 3e:
Angabe der Zeichen durch ihren ASCII-Wert in Hexadezimaldarstellung unter Nutzung von Escape-Zeichen.


Version 3g:
Ausgabe von "Hello, World" als 'codierte' Zeichenkette

  #include <stdio.h>

  int main(void)
  {
    char msg[] = "\110\145\154\154\157\54\40\127\157\162\154\144\12";

    puts(msg);

    return 0;
  }
Im Vergleich zur Version 3e:
Angabe der Zeichen durch ihren ASCII-Wert in Oktaldarstellung unter Nutzung von Escape-Zeichen.


Version 4:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char msg[] = "Hello, World\n";
    int l = strlen(msg);
    int i;

    for ( i=0; i<l; i++ )
      putchar(msg[i]);

    return 0;
  }
Im Vergleich zur Version 3:
Die Länge der Zeichenkette msg wird nicht explizit angegeben, sie wird durch strlen ermittelt.


Version 5:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char msg[] = "Hello, World\n";
    int i;

    for ( i=0; msg[i]; i++ )
      putchar(msg[i]);

    return 0;
  }
Im Vergleich zur Version 4:
Das Ende der Zeichenkette wird nicht explizit durch die Längeninformation, sondern durch die abschließende binäre Null ermittelt.


Version 5a:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char *msg = "Hello, World\n";

    for ( ; *msg; msg++ )
      putchar(*msg);

    return 0;
  }
Im Vergleich zur Version 5:
Die Laufvariable i wird eingespart, statt dessen wird der Zeiger msg verwendet.
Achtung: msg zeigt anschließend auf die leere Zeichenkette !


Version 6:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char *msg = "Hello, World\n";

    while ( *msg )
      putchar(*msg++);

    return 0;
  }
Im Vergleich zur Version 5a:
Anstelle von for wird while benutzt.


Version 7:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char *msg = "Hello, World\n";

    while ( *msg )
      fputc(*msg++, stdout);

    return 0;
  }
Im Vergleich zur Version 6:
Anstelle der Ausgabefunktion putchar wird fputc eingesetzt.


Version 8:
Zeichenweise Ausgabe von "Hello, World"

  #include <stdio.h>

  int main(void)
  {
    char *msg = "Hello, World\n";

    while ( fputc(*msg++, stdout) ) ;

    return 0;
  }
Im Vergleich zur Version 7:
Kompaktere Darstellung der Schleife.


Version 9a:

  #include <stdio.h>

  int main(void)
  {
    union {
      char c[16];
      long z[4];
    } p;
    int i = 0;

    p.z[0] = 0x6c6c6548;             /* Variante fuer little endian */
    p.z[1] = 0x57202c6f;             /*       z.B. PC               */
    p.z[2] = 0x646c726f;
    p.z[3] = 0x0000000a;

    while ( fputc(p.c[i++], stdout) ) ;

    return 0;
  }
Im Vergleich zur Version 8:
Indirekte Angabe der Zeichenkette "Hello, World".
Eingeschränkte Portabilität durch Abhängigkeit
- vom ASCII-Zeichensatz
- der Byteanordnung des verwendeten Rechners


Version 9b:

  #include <stdio.h>

  int main(void)
  {
    union {
      char c[16];
      long z[4];
    } p;
    int i = 0;

    p.z[0] = 0x48656c6c;             /* Variante fuer big endian */
    p.z[1] = 0x6f2c2057;             /* z.B. einige Workstation  */
    p.z[2] = 0x6f726c64;
    p.z[3] = 0x0a000000;

    while ( fputc(p.c[i++], stdout) ) ;

    return 0;
  }
Im Vergleich zur Version 9a:
Verwendung einer anderen Byteanordnung (big endian statt little endian).


Version 10b:
Zeichenweise Ausgabe von "Hello, World", Text ist (leicht) codiert gespeichert

  #include 
  
  int main(void)
  {
    union {
      char c[16];
      long z[4];
    } p;
    int i = 0;
  
    p.z[0] = 0x48646e6f;             /* Variante fuer big endian */
    p.z[1] = 0x6b292650;             /* z.B. einige Workstation  */
    p.z[2] = 0x677b666f;
    p.z[3] = 0x060d6762;
  
    while ( fputc((p.c[i++])^i, stdout) ) ;
  
    return 0;
  }
Im Vergleich zur Version 9b:
Einfache Codierung der indirekt angegebenen Zeichenkette mittels XOR.


Vergleich der mit verschiedenen Systemen erstellten Objektcodedateien:


---------------------------------------------------------
       AIX                         WIN32  DOS
Ver    cc   cc     gcc  gcc  gcc   bcc    msc  msc  gcc
sion        -O          -O1  -O2               -Od
---------------------------------------------------------
1      949  933    710  694  694   389    311  324  489
2      949  933    710  694  694   387    308  321  489

1a                                 415    329  343  534
2a                                 413    327  341  534

3     1189 1137    994  886  936   468    421  444  547
3a    1190 1138    995  887  937   471    423  446  547
3b    1190 1138    995  887  937   471    423  447  547
3c                                 471    423  447  547

4     1307 1247   1064  952  998   498    436  463  597
5     1253 1161   1010  910  956   474    407  435  561
6     1229 1161    974  886  936   448    395  423  513
7     1097 1073    866  830  826   426    355  368  562
8     1133 1107    858  818  818   423    349  364  562

9a    1070 1036    738  778  738
9b    1070 1036    738  778  738

10b   1079 1061    790  446  746

Zurück zum Menü
Zurück zur vorigen Seite Weiter zur nächsten Seite

P. Böhme, 12.03.1996