sizeof: Probleme bei Auswertung
-
Hallo zusammen,
ich habe ein kleines Problem mit der Auswertungsreihenfolge (zumindest vermute ich hier das Problem) von sizeof in einer if-Abfrage.
Hier mal 2 Codeschnipsel:
Die Struktur teststruct hat jeweils 8 Byte.int size = 100; if(108 - size - 2*sizeof(struct teststruct) > 0) printf("ausgabe");
Obwohl die Abfrage 108 - 100 - 2*8 kleiner Null ist, wird trotzdem ausgabe ausgegeben
Anhand folgendes Schnipsels gehe ich eben davon aus, dass das Problem bei der Auswertreihenfolge liegt:
int size = 100; int sizevar = sizeof(struct teststruct); if(108 - size - 2*sizevar > 0) printf("ausgabe");
Hier kommt dann eben keine Ausgabe. Natürlich hab ich damit schon rausgefunden, wie ich das Problem umshciffen kann, aber es wäre nett, wenn mir jemand genau sagen könnte, wo mein Problem liegt
-
Chrisistda schrieb:
Obwohl die Abfrage 108 - 100 - 2*8 kleiner Null ist
ich dachte, ein unsigned int kann gar nicht kleiner 0 werden.
108 - size - 2*sizeof(struct teststruct) > 0
ist
108 > size + 2*sizeof(struct teststruct)
ist
size + 2sizeof(struct teststruct) < 108
gib's zu: du wolltest nur schauen, ob size+2sizeof(struct teststruct) kleiner als 108 ist und hast den code mit - und >0 nur gebaut, um dich zu verwirren.
-
volkard schrieb:
gib's zu: du wolltest nur schauen, ob size+2*sizeof(struct teststruct) kleiner als 108 ist und hast den code mit - und >0 nur gebaut, um dich zu verwirren.
Er hat den Code geschrieben weil es ein kleines Beispiel ist das das Problem zeigt.
Kommt es mir nur so vor oder ist volkard voll am trollen? Das tut der öfters. Was mich irritiert ist, dass er ein Mod ist. Wer stellt denn einen Troll als Mod ein?
Edit:
Ändert man das Beispiel inint size = 100; unsigned int sizevar = sizeof(struct teststruct); if(108 - size - 2*sizevar > 0) printf("ausgabe");
kommt wieder Blödsinn raus. Es scheint so als würde der gcc aus signed int + unsigned int ein unsigned int machen.
int size = 100; if(108 - size - 2*(int)sizeof(struct teststruct) > 0) printf("ausgabe");
Läuft wieder richtig. Äußerst bescheuertes und unerwartetes Verhalten. Die casting-Regeln sagen wohl, dass beim Rechnen mit signed und unsigned die signed implizit in unsigned umgecastet werden.
-
nwp2 schrieb:
Wo steht denn hier ein unsigned int?
im sizeof
#include <stdio.h> struct teststruct { int i; int j; }; int main() { double d=8 - 2*sizeof(struct teststruct); printf("%lf\n", d); }