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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.