Frage zu C Code: Logische Funktion

Gast #7309582
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren