Forum: PC-Programmierung Frage zu C Code: Logische Funktion


von Modellbau_Hund (Gast)


Lesenswert?

Wie schafft es b, dass es 10 wird?

1
int main()
2
{
3
int a,b,c;
4
a = b = c = 10;
5
c = a++ || ++b && ++c;
6
printf("%d %d %d",c, a, b);
7
return 0;
8
}
1 11 10

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


Danke

von Stephan (Gast)


Lesenswert?

Modellbau_Hund schrieb:
> Wie schafft es b, dass es 10 wird?

Möglichkeit:
a. indem Du b nicht um eins inkrementiertst?
b.
1
b=10;
 schreibst?

von Modellbau__Hund (Gast)


Lesenswert?

Stephan schrieb:
> Modellbau_Hund schrieb:
>> Wie schafft es b, dass es 10 wird?
>
> Möglichkeit:
> a. indem Du b nicht um eins inkrementiertst?
> b.
>
> b=10;
>
> schreibst?

Ich meine warum wird a inkrementiert und b nicht?

von Klaus (feelfree)


Lesenswert?

Der Ausdruck nach dem || wird nicht mehr ausgewertet, weil der gesamte 
Ausdruck schon wahr ist und nicht mehr wahrer werden kann.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Modellbau_Hund schrieb:
> Wie schafft es b, dass es 10 wird?

Es "wird" nicht 10, sondern bleibt es.

> c = a++ || ++b && ++c;

Bei dem || kommt die short circuit evaluation zum Einsatz. Das heißt, 
die rechte Seite wird nur ausgeführt, wenn die linke ein logisches false 
ergibt.

von Modellbau_Hund (Gast)


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

von A. B. (Gast)


Lesenswert?

Wer Seiteneffekte in einen Funktionsaufruf packt, ist selbst schuld:
Die Auswertungsreihenfolge von Funktionsparametern ist nicht 
spezifiziert.

von Dirk B. (dirkb2)


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.

von Dergute W. (derguteweka)


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

von Modellbau_Hund (Gast)


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?

von Dergute W. (derguteweka)


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

von Dirk B. (dirkb2)


Lesenswert?

Modellbau_Hund schrieb:
> 0b00001000 > 0b1111111
> ==> false

8 > 255 ist false

sizeof() liefert einen Wert vom Typ size_t zurück.
Das ist ein unsigned Typ.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.