Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
int main() { int a=12; int b=0; if(b - sizeof(a) >= 0) printf("True\n”"); else printf("False\n"); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
#include <stdio.h> int main() { int a=12; int b=0; if(sizeof(a) == 0) printf("True\n”"); else printf("False\n"); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
#include <stdio.h> int main() { int a=12; int b=0; if(b - (int)sizeof(a) >= 0) printf("True\n”"); else printf("False\n"); } |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (19.04.2012, 14:56)
Zitat
Ich versuche gerade herauszufinden, wie sizeof im Präprozessor interpretiert wird.
Zitat
Da if im Präprozessor, sizeof aber erst im Compiler bearbeitet wird, ist die Ausgabe hier "True".
Zitat
Online habe ich mehrmals gelesen, sizeof() würde als 0 ersetzt werden
Zitat
Warum wird durch casten von sizeof die Rechnung richtig?
C-/C++-Quelltext |
|
1 |
0 - (size_t)4 == 4294967292 |
Okay, stimmt, #IF wird da ausgewertet. Trotzdem ist die Ausgabe von b-sizeof(a) eben nicht False wie du vermutest, sondern True. Das ganze geht ursprünglicherweise von einer Aufgabe an der Uni aus, wo wir eben genau dies untersuchen sollen. Ebenfalls wenn ich einfach nur"if" wird nicht im Präprozessor ausgewertet, "#IF" wird. Damit macht dann plötzlich alles da einen Sinn.
b ist 0.
sizeof(a) ist das selbe wie (int)sizeof(a) und in jedem Fall zur Laufzeit größer 0.
Somit ist "b - (int)sizeof(a)" dasselbe wie "b - sizeof(a)" und immer kleiner als 0, weil 0-x < 0, falls x > 0. Daher auch "False". Alles weitere ist bedingt durch Überläufe Deiner Operationstypen.
C-/C++-Quelltext |
|
1 2 |
if(- sizeof(a) >= 0) ausgabe1; else ausgabe2; |
Dies erklärt mir das ganze, danke. Ich war da mit dem Präprozessor völlig auf dem Holzweg. Danke!Zitat
"sizeof" liefert einen vorzeichenlosen Typen "size_t" zurück.
Erst wenn dieser explizit umgewandelt wird, wird der Überlauf(Unterlauf) verhindert.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dies ändert sich allerdings durch das casten, nun kommt False raus. Es scheint also trotzdem sizeof() nicht komplikationsfrei mit if zu laufen
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> struct data_t { int id; int x, y; }; void copy_data(struct data_t *val, int maxbyte) { printf("maxbyte: %d\n*val: %d\n" ,maxbyte, sizeof(*val)); printf("maxbyte-*val: %d\n", maxbyte-sizeof(*val)); if(maxbyte - sizeof(*val) >= 0){ printf("True\n"); } else{ printf("False\n"); } } int main() { struct data_t test={3,4,5}; copy_data(&test, 0); } |
C-/C++-Quelltext |
|
1 |
printf("maxbyte-*val: %d\n", maxbyte-sizeof(*val)); |
C-/C++-Quelltext |
|
1 |
if(maxbyte - sizeof(*val) >= 0) |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Werbeanzeige