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.
-
@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.
-
@EinNutzer0 Wenn sich dein Compiler nicht beschwert, bedienst du ihn falsch
-
Natürlich ging es darum, dass er sich bei
-Wall
beschwert, über ein Problem, das praktisch gesehen niemals auftritt.Aber von mir aus verwendet doch den esoterischen Firlefanz von Wutz, auch wenn der nicht besser lesbar is. Ich verwende meins und gut is.
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
Natürlich ging es darum, dass er sich bei -Wall beschwert, über ein Problem, das praktisch gesehen niemals auftritt.
Es geht darum was im Standard steht.
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
über ein Problem, das praktisch gesehen niemals auftritt.
So, meinst du.
Du täuscht dich.Das ist ja das blöde an UB, dass es nicht auftreten muss.
Dabei ist es so einfach das UB zu umgehen.
-
Vielen Dank für Eure Hilfe.
Bevor die Diskussion weiter geht, könnt ihr einem Amateur noch einmal helfen
Es geht zurück an die Basics..
Ich schreibe folgenden Code:
double zahl1; printf("Zahl eingeben: "); scanf("%lf", &zahl1); printf("Zahl lautet: %f", zahl1);
Eine Dezimalzahl wird eingegeben.
Wieso gibt die Printf das richtige Ergebnis aus, obwohl prinzipiell für die "double" deklaration %lf gillt?Dankeeeee
-
printf()
ist eine Funktion mit variabler Zahl an Parametern. Solchen Funktionen kann man keinenfloat
übergeben weil die "Default Conversions" greifen. Also gibt es fürprintf()
und Freunde auch keinen unterschied zwischen%f
und%lf
.https://en.cppreference.com/w/cpp/language/variadic_arguments
-
Und noch zu ergänzen: die Parameter für scanf und printf sind nicht identisch.
Schau dir https://en.cppreference.com/w/c/io/fscanf und https://en.cppreference.com/w/c/io/fprintf an. Auf letzterer Seite siehst du auch, dass f und lf beide ein double-Parameter erwarten.Edit: Links für C (statt C++)