Frage zu C Code: Logische Funktion

Gast #7309582

Danke sehr !

Hier noch so was..

1
int i=0;
2
int m=0;
3
++m; // wird zuerst um 1 erhöht
4
printf("%d und %d  und m = %d\n",++i,  ++i,m);

2 und 2 und m = 1

Warum hat i den Wert 2?

Weil i zuerst um 1 erhöht wird durch den einen Operator und dann nochmal durch den anderen und dann erst wird printf ausgeführt?


Und bei folgendem wird dann zuerst der Operator in der Mitte ausgeführt und der linke zuerst angezeigt, dann der in der Mitte und dann am Ende wird i angezeigt

1
i=0;
2
printf("%d und %d  und i= %d\n",i++,  i++,i);

1 und 0 und i= 2


Hier noch ein Code den ich nicht verstehe:

1
#include <stdio.h>
2
#include <math.h>
3

4
#define PRODUCT(x) (x*x*x*x)
5

6
int main()
7
{
8

9
int x = 2;
10
int result = PRODUCT(x++);
11
printf("%d %d", x, result);
12
return 0;
13

14
}

Ergebnis:

1
6 120
2

3
...Program finished with exit code 0
4
Press ENTER to exit console.

Der Compiler inkrementiert x vier mal

Also er erstellt x++ * x++ * x++ * x++

Aber warum entsteht dann 2 * 3 * 4 * 5 = 120 ,warum nicht 2 * 2 * 2 * 2 und x wird dann 2+ 4 Inkremente= 6..

Aber ist doch ein Post-Inkrement oder? Ach so, bei

#7309606

Du hast „undefined behavior„ (undefiniertes Verhalten) entdeckt.

Wann die Auswertung innerhalb eines sog. Sequenze Points erfolgt, ist nicht festgelegt. Das kann der Compiler halten wie er will. Das kann bei einer anderen Optimierungsstufe oder Compilerversion wieder anders sein.

#7309612

Moin,

Voellig verrueckter Vorschlag: Solche eigenartigen Konstrukte einfach komplett bleiben lassen. So wie man beim Essen auch nicht ruelpst, beim Kauen spricht oder sich dabei am A.. kratzt, wenn man hoeflich ist. Dann muss man nicht gross nachsinnieren und vor allem muss dann die arme Sau, die den Code mal erbt, nicht gross gruebeln, was da bei so einem Konstrukt wohl rauskommen soll oder kann oder muss...

Gruss WK

Gast #7309669
1
if(sizeof(double) > -1)
2
{printf("M");}
3
else
4
{printf("m");}

also 8 = 0b00001000 -1 = 0b1111111

0b00001000 > 0b1111111 ==> false

..

  • warum kommt da "m" raus?
  • Warum erkennt die If-Verzweigung das nicht?
#7309681

Modellbau_Hund schrieb:

  • warum kommt da "m" raus?
  • Warum erkennt die If-Verzweigung das nicht?

Warum schaltest du beim compilieren nicht die Warnings an, die deinem Programmierstil gerecht werden? Wenn die an sind, warum ignorierst du die dann?

1
warning: comparison of integer expressions of different signedness: ‘long unsigned int’ and ‘int’ [-Wsign-compare]
2
    7 | if(sizeof(double) > -1)

Gruss WK

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.