Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Schreibe ein Programm, das "2+2=5" ausgibt!
Dirk Offline
Software Archäologe

Beiträge: 12.387
Registriert seit: Jul 2008
Beitrag #11
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
Mathematika soll sich doch verrechnen, wozu also selber was verbocken?

28.10.2014 19:46
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
andeq r0, r0, r0

Beiträge: 11.943
Registriert seit: Jul 2008
Beitrag #12
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
Dieses Programm gibt alles mögliche außer dem richtigen Ergebnis aus.
Code:
#include <stdio.h>

int main(void) {

  int numbers[6];
  numbers[0] = 0;
  int i = 0;

  while (i < 6) {
    /* um eins erhöhen und in den Nachfolger schreiben */
    numbers[++i] = numbers[i] + 1;
  }

  printf("2 + 2 = %d\n", numbers[2 + 2]);

  return 0;
}

Berühr die Kuh.
Mach es im Nu.

<~Vez> CloverOS would be perfect if you could change the wallpaper
28.10.2014 20:24
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Online
Quälgeist

Beiträge: 8.789
Registriert seit: Jul 2008
Beitrag #13
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
(28.10.2014 20:24)DosAmp schrieb:  (20:35:21) DosAmp: (ich hab ehrlich gerade keinen plan, woran es liegt, dass mein c-programm uninitialisierten speicher liest und verarbeitet)
Das Problem hier ist, dass die Evaluationsreihenfolge von "numbers[++i] = numbers[i]" nicht definiert ist. Der Assignment-Operator ( = ) in C ist kein Sequence-Point (+ übrigens auch nicht), das heisst der C-Compiler darf selber entschieden, welchen Ausdruck er wann evaluiert. Gleiches Phänomen wie thosch97 sein zweites Beispiel.

Es wird also von deinem Compiler folgendes ausgeführt. Andere Compiler können das anders interpretieren.
Code:
while (i < 6) {
    /* um eins erhöhen und in den Nachfolger schreiben */
    int tmp = ++i;
    numbers[tmp] = numbers[i] + 1;
  }
Nachtrag: Ausserdem macht das hier nen Zugriff auf numbers[6], also ausserhalb des Arrays, was auch böse ist.
(Dieser Beitrag wurde zuletzt bearbeitet: 28.10.2014 21:14 von gandro.)
28.10.2014 20:41
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Online
Quälgeist

Beiträge: 8.789
Registriert seit: Jul 2008
Beitrag #14
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
Wenn wir schon bei obskurem C sind (gibt nicht 5, aber auch nicht 4).

Code:
#include <stdio.h>

int main() {
    printf("2 + 2 = %d\n", (2,0 + 2,0));
    return 0;
}

Nachtrag: %f → %d
(Dieser Beitrag wurde zuletzt bearbeitet: 28.10.2014 21:40 von gandro.)
28.10.2014 21:29
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #15
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
2,0 statt 2.0 klingt ja schon beim lesen nach lustigen Fehlern
28.10.2014 21:30
Diese Nachricht in einer Antwort zitieren
gandro Online
Quälgeist

Beiträge: 8.789
Registriert seit: Jul 2008
Beitrag #16
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
(28.10.2014 21:30)mrshadowtux schrieb:  2,0 statt 2.0 klingt ja schon beim lesen nach lustigen Fehlern
Ist ein komplett standardkonformes C-Programm :P
28.10.2014 21:31
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
oreissig Offline
Maître Modérateur

Beiträge: 12.022
Registriert seit: Jul 2008
Beitrag #17
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
Der Komma-Operator ist halt einer der hirnverbrannteren Teile des C-Standards.
28.10.2014 21:33
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mrshadowtux
Unregistered

 
Beitrag #18
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
Wie wirkt sich in dem Fall denn son , aus?

Öh..
[Bild: f7edb8834a82781787fb9fceb7ec91dd.png]
28.10.2014 21:33
Diese Nachricht in einer Antwort zitieren
gandro Online
Quälgeist

Beiträge: 8.789
Registriert seit: Jul 2008
Beitrag #19
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
(28.10.2014 21:33)mrshadowtux schrieb:  Wie wirkt sich in dem Fall denn son , aus?
Ein Ausdruck "x,y" berechnet zuerst x, verwirft das Resultat; berechnet dann y und gibt das zurück.

printf("%d\n", (1+1, 2+2, 3+3)) berechnet zuerst 1+1, dann 2+2, dann 3+3 und übergibt dann 6 (=3+3) dem printf.

(2,0 + 2,0) berechnet also zuerst 2, dann 2+0, dann 0 und verwendet 0 für die Ausgabe.

Nachtrag. Zu den Warnungen, stimmt, doch nicht ganz standard-konform weil ich einen Integer als Float ausgebe.
Korrekterweise müsste man printf("%f", (float) (2,0 + 2,0)) oder printf("%d", (2,0 + 2,0)) schreiben. Da 0 aber auch 0.0 in Float ist, funktioniert es.
(Dieser Beitrag wurde zuletzt bearbeitet: 28.10.2014 21:39 von gandro.)
28.10.2014 21:37
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
andeq r0, r0, r0

Beiträge: 11.943
Registriert seit: Jul 2008
Beitrag #20
RE: Schreibe ein Programm, das "2+2=5" ausgibt!
(28.10.2014 21:33)mrshadowtux schrieb:  Wie wirkt sich in dem Fall denn son , aus?
  1. "2" wird evaluiert und weggeschmissen.
  2. "0 + 2" wird evaluiert und weggeschmissen.
  3. "0" wird evaluiert und zurückgegeben. Zufälligerweise passt ein 32-Bit-Integer von der Größe her zu einem Float einfacher Genauigkeit (bzw. haben 0 und 0.0f dieselbe Repräsentation), weswegen printf keinen groben Unfug baut.

Berühr die Kuh.
Mach es im Nu.

<~Vez> CloverOS would be perfect if you could change the wallpaper
(Dieser Beitrag wurde zuletzt bearbeitet: 28.10.2014 21:39 von DosAmp.)
28.10.2014 21:37
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste