Zahl in Ziffern zerlegen und abspeichern.
-
Siehe auch Slides 17&18 hier, Funktion "digits10":
https://de.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c@titan99_: verstehe nicht, was du uns damit sagen willst.
-
Dieser Beitrag wurde gelöscht!
-
Dieser Beitrag wurde gelöscht!
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
for (i = 0; /* true */; i++) // i bekommt den wert 0 zugewiesen, die for-Schleife laeuft solange true // und das Statement i++ wird nach jedem Schleifendurchlauf ausgefuehrt. { array[i] = new % 10; if (new /= 10) continue; else break; }
das lässt sich nochmal verkürzen, als Demo zum Verstehen des Codes aber nicht mehr so gut:
for (i = 0; /* true */; i++) { array[i] = new % 10; if (!(new /= 10)) break; }
und nochmal:
for (i = 0; array[i] = new % 10, new /= 10 ; i++);
-
Hi Zamm',
ich wühle den Thread nochmal auf, da ich noch über etwas gestolpert bin, was ich so hingenommen habe, ohne es wirklich zu verstehen.
Zur Erinnerung: Es ging sich darum eine Zahl "new" in die einzelnen Ziffern zu zerlegen.
array[i] = new % 10; if (new /= 10) continue; else break;
das:
if (new /= 10)
bedeutet ja eigentlich:
if (new= new/10)
in wie fern ist diese Bedingung erfüllt, wenn new 1234 ist? Warum hört die If Schleife dann auf, wenn die letzte Ziffer erreich ist?
Grüße
-
@daniwe Irgendwann gibt
new / 10
=0
und0
istfalse
(alles andere ungleich0
isttrue
). beachte daß es sich um eine Ganzzahldivision handelt.
-
Wurde hier Rekursion schon genannt?
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%d ", x % 10); } } int main(int argc, char const *argv[]) { print(1234567890); return 0; }
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
Wurde hier Rekursion schon genannt?
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%d ", x % 10); } } int main(int argc, char const *argv[]) { print(1234567890); return 0; }
ub.
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
Wurde hier Rekursion schon genannt?
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%d ", x % 10); } } int main(int argc, char const *argv[]) { print(1234567890); return 0; }
ub.
Was soll daran ub sein? Das ist höchstens nicht well-formed, aber wenn es übersetzt ist das 100% definiert.
-
@SeppJ Beim Parametertyp ultraschlau sein wollen und nicht zu ende denken -> ub.
-
@daniwe sagte in Zahl in Ziffern zerlegen und abspeichern.:
Hi Zamm',
ich wühle den Thread nochmal auf, da ich noch über etwas gestolpert bin, was ich so hingenommen habe, ohne es wirklich zu verstehen.
Zur Erinnerung: Es ging sich darum eine Zahl "new" in die einzelnen Ziffern zu zerlegen.
array[i] = new % 10; if (new /= 10) continue; else break;
das:
if (new /= 10)
bedeutet ja eigentlich:
if (new= new/10)
in wie fern ist diese Bedingung erfüllt, wenn new 1234 ist? Warum hört die If Schleife dann auf, wenn die letzte Ziffer erreich ist?
Grüße
Ne,
if( new /= 10 )
bedeutetif( new /=10 != 0 )
. Bin kein Freund von solchen "Optimierungen".
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
Beim Parametertyp ultraschlau sein wollen und nicht zu ende denken
Was soll daran nicht durchdacht sein, es ist lediglich die bisher lesbarste Rekursion. Natürlich stellt 0 ein Sonderfall dar. Und das rekursiver Code in Produktivsystemen nicht eingesetzt werden sollte, ist auch Quatsch, da
int64_t
oderuint64_t
nur eine sehr begrenzte Anzahl an Dezimalziffern besitzt (nämlich 20). Manchmal denke ich, die Leute sind einfach nur dumm oder wollen eben provozieren.
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
Manchmal denke ich, die Leute sind einfach nur dumm oder wollen eben provozieren.
Manchmal denke ich, die Leute lesen einfach nicht richtig oder verstehen nicht richtig, was jemand schreibt oder meint.
@Swordfish wies hin auf den Paramtertyp!
int64_t
- wo könnte das relevant sein? Gegebenfalls warnt sogar der Compiler? Formatstrings und so!
-
Warnung: Format »%d« erwartet Argumenttyp »int«, aber Argument 2 hat Typ »int64_t {aka long int}« [-Wformat=] printf("%d ", x % 10);
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%ld ", x % 10); } } int main(int argc, char const *argv[]) { print(-10000000000); return 0; }
So besser?
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
So besser?
Nein.
und andernorts wie der gottgesanndte Messias tun. Boah ey.
-
#include <stdio.h> void print1(uint64_t); void print0(int64_t x) { if (!x) { printf("%ld ", x); } else { if (x < 0) { printf("-"); print1(-x); } else { print1(x); } } printf("\n"); } void print1(uint64_t x) { if (x) { print1(x / 10); printf("%lu ", x % 10); } } int main(int argc, char const *argv[]) { print0(0); print0(-1); print0(+1); print0(-123); print0(+123); return 0; }
-
7.8.1 Macros for format specifiers
1 Each of the following object-like macros expands to a character string literal containing a
conversion specifier, possibly modified by a length modifier, suitable for use within the
format argument of a formatted input/output function when converting the corresponding
integer type. These macro names have the general form of PRI (character string literals
for the fprintf and fwprintf family) or SCN (character string literals for the
fscanf and fwscanf family),220) followed by the conversion specifier, followed by a
name corresponding to a similar type name in 7.20.1. In these names, N represents the
width of the type as described in 7.20.1. For example, PRIdFAST32 can be used in a
format string to print the value of an integer of type int_fast32_t.
2 The fprintf macros for signed integers are:
PRIdN PRIdLEASTN PRIdFASTN PRIdMAX PRIdPTR
PRIiN PRIiLEASTN PRIiFASTN PRIiMAX PRIiPTR
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
printf("%ld ", x % 10);
Da x%10 einen sehr begrenzten Wertebereich hat, kann man den auch auf
int
casten. Dann passt %dOder man verzichtet gleich auf das Monster printf und gibt das einzelne Zeichen ('0' + x%10) aus.
-
@DirkB ja, es ging ja darum, dass sich Swordfishs sein Compiler beschwert hätte.
-
@EinNutzer0 Nein. Es geht nicht darum ob sich ein Compiler beschwert.