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
|
Forum: PC-Programmierung Frage zu C Code: Logische Funktion
You were forwarded to this site from EmbDev.net. Back to EmbDev.net
Wie schafft es b, dass es 10 wird?
1 11 10 ...Program finished with exit code 0 Press ENTER to exit console. Danke Modellbau_Hund schrieb: > Wie schafft es b, dass es 10 wird? Möglichkeit: a. indem Du b nicht um eins inkrementiertst? b.
schreibst? 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? Der Ausdruck nach dem || wird nicht mehr ausgewertet, weil der gesamte Ausdruck schon wahr ist und nicht mehr wahrer werden kann. :
Bearbeitet durch User
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. Danke sehr ! Hier noch so was..
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 und 0 und i= 2 __________________________________ Hier noch ein Code den ich nicht verstehe:
Ergebnis:
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 Wer Seiteneffekte in einen Funktionsaufruf packt, ist selbst schuld: Die Auswertungsreihenfolge von Funktionsparametern ist nicht spezifiziert. 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. 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
also 8 = 0b00001000 -1 = 0b1111111 0b00001000 > 0b1111111 ==> false .. * warum kommt da "m" raus? * Warum erkennt die If-Verzweigung das nicht? 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?
Gruss WK 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.
|
|