Frage zu Typumwandlung vor der Division

#1
Hallo

Ich Lese gerade das Buch C/C++ Das umfassende Handbuch.
Bin leider noch ziemlich am Anfang und habe ein Problem.

Auf Seite 55; "Listing 3.6 Typumwandlung vor der Division" steht
ein gekürzter Quelltext;


[ICODE
]void main()
{
int a = 1, b = 2;
float x;
x = ((float)a)/b;
}
[/ICODE]

(So aus Buch kopiert)

Laut Buch, ist dies eine Explizite Typenumwandlung und "0,5" soll als Ergebnis herauskommen.
Ich habe aber als Ergebnis immer 0 und nicht 0,5.
Mach ich etwas falsch oder ist an dem Beispiel etwas falsch?
Zudem stellt sich mir die Frage ob in diesem Fall eine Umwandung nötig wäre, da "x" schon von vornherein als "float" definiert wurde.
Oder liege ich da auch falsch?
Hab aus Spass versucht "x" als int zu definieren , kommt aber auch 0 bei rum.

würde mich über Antwort freuen
Danke im voraus.*
 

AGGROStar1991

Well-Known Member
c-b Experte
#2
Zum ersten : kein gutes Buch, such dir ein Besseres( sieht man zum Beispiel an "void main").
Zum zweiten : Code immer in entsprechenden Tags posten, so wird er hervorgehoben etc.

Da du so ein schrottiges Mischmasch-Buch hast und es für Typenzeug durchaus eine Rolle spielen kann : willst du nun C oder C++ lernen?

Ich fang mal rückwärts an zu Antworten :
Der explizite Cast ist unnötig, da sonst folgendes passieren würde : er führt eine Integerdivision aus, das ist bei 1/2 richtigerweise 0 mit Rest 1. Das wird dann implizit zum Float gecastet und du erhälst x = 0.0. Da in deinem Beispiel nun aber der Cast stärker bindet als die Division wird zuerst a explizit gecastet, dann b implizit. Das äußere Klammerpaar kannst du auch einfach weg lassen. Für Beispiele siehe hier : https://de.wikibooks.org/wiki/C++-Programmierung:_Typumwandlung. Generell sieht das Beispiel aber richtig aus. Wie gibst du den Wert aus oder überprüfst ihn?

Sofern du C++ verwendest ist diese Lösung aber stilistisch falsch, da dort grundsätzlich keine C-(oder "Old-Style") Casts verwendet werden sollten, sondern anstelle dessen die operatoren static_cast, const_cast, reinterpret_cast und dynamic_cast. Und wenn dein Compiler diesen Code mti dem void main einfach kompiliert such dir dringend einen anderen, dazu eine IDE die bei sowas alarm schlägt und dreh die Compilerwarnungen voll auf.

mfg
 
#4
Erstmal Hallo
Danke für den tipp was das Buch angeht. Werde mir weitere zulegen.
Eigentlich sollte der Code hervorgehoben werden, da hab ich woh was falsch gemacht, Entschuldigt.
Da das Buch erst C behandelt und später auch C++ möchte ich überwiegend C lernen. Später gehts dann weiter ( wohl eher mit Java -bin noch unschlüssig-).
Mit der Frage, wie ich den Wert ausgebe oder überprügfe kann ich nur so beantworten das ich das in "VsCode" oder "CodeBlocks" (mingw-w64) einfach compiliere und in der "Console" mit printf("x: %i", x) ausgeben lasse. Laut Buch soll das 0,5 rauskommen, tut es aber nicht. An der Stellle im Buch, wird im Augebnblik nicht näher eingegagen. Und da ich lieber ohne Fehler lerne, wollte ich erst weitermachen, wenn sich dieser evtl Fehler geklärt hat.
Danke für deine Antwort.
Kannst du ein Buch empfehlen?
Grüße

Edit;
Ich habs:
Ich habe einen falsche "Formatieranweisung -Formatspezifizierer-" benutzt.
Ich muss mir die Ausgabe mit "%f" ausgeben lassen.
Damit ;
C:
#include <stdio.h>

int main()
{
    int a = 1, b = 2;
    float x;

    x = ((float)a)/b;

    printf("x: %f", x);

    return 0;

}
klappts auch..
Danke euch vielmals, jetzt kommt auch "0,5" raus.
Jetzt stellt sich ur noch die Frage ob du mir och schnell ein Buch empfehlen kannst, sonst hat sich meine Frage ja erledigt.
Danke nochmal
 
Zuletzt bearbeitet:

AGGROStar1991

Well-Known Member
c-b Experte
#5
@BAGZZlash Oh ja danke, natürlich! Ist einfach nur ein Aufmerksamkeitstest, der Rest stimmt ja :p

@SlikZ Wenn dein Ziel Java ist lern Java. Wenn dein Ziel C++ ist lern C++(Man könnte sogar argumentieren, dass erst C lernen dich dabei behindert). Nur wenn dein Ziel C ist lern C, aber wie gesagt mit einem anderen Buch. Es gibt kaum ein sichereres Zeichen dass das Buch Müll ist als dass "void main" darin vorkommt ;) Denn das ist kein valides C++ , war es auch nie, und laut Bjarne ist es nicht einmal valides C. Das ist irgendein standardwidriger Müll den Microsofts Compiler dennoch erlaubt haben.

Dachte ichs mir doch : %i specifier hat einfach nochmal gecastet.

Für den VSCode gibts ein Plugin das sich vscode-clangd nennt, das hat Formatting, Compiler-Warnings, Refactoring und einen Linter. Da ich nicht weiß, welchem Compiler du benutzt kann ich dir da zu den Optionen wenig sagen( auch weil ich zum Beispiel den MSVC++ schlicht weder gut kenne noch benutze). Zu GCC Warnings steht unten was, bei clang einfach den gleichen "-std="-Flag setzen und als Warnoption "-Weverything" mitgeben.

Zu CodeBlocks kann ich nicht wirklich raten, obwohl Mingw(also GCC) als compiler schon recht vernünftig ist, ich nehme an du hast da einfach die Warnungen ausgestellt(Code::Blocks habe ich ewig nicht genutzt, keine Ahnung wie du die da anstellst, aber für GCC willst du mindestens folgende : "-Wall -Wextra -Wpedantic -Wshadow -Werror" und gleich auch noch, je nach dem ob du dich nun für C oder C++ entscheidest "-std=c11" oder "-std=c++17". Meine persönliche Meinung an der Stelle ist : es gibt speziell für Anfänger nur eine sehr sehr kurze Liste an Gründen,C zu lernen wenn auch C++ eine Option wäre. Unter anderem dass dir C mehr im Weg ist als dass es hilft, siehst du ja an printf mit seinen specifiern. In C++ jagst du das ( zumindest als Anfänger) in cout und cout kümmert sich darum, das kann beinahe alles ausgeben das dir erstmal so über den Weg läuft.
Mal davon abgesehen dass eine dynamische Liste von Integern befüllen und darüber iterieren( braucht man extreeeem häufig) in C++ 2 Zeilen erfordert
C++:
std::vector<int> lst = {1, 2, 3, 4};
for(int &p : lst) std::cout << p << "\n";
Während du in C erstmal noch selbst eine Liste erfinden musst bei der du keine Hoffnung hast dass sie auch nur annähernd so schnell ist(dieser Code ist so lang dass ich ihn hier nicht posten will, und auch ein bisschen weil es mich(ich programmiere seit weit mehr als einem Jahrzehnt auch C) garantiert mehr als eine Stunde kosten würde eine saubere C Implementierung zu schreiben), so als Denkanstoß.

Als Bücher zu Reinem C( natürlich nicht C++, da gibts andere) fallen mir so ein : "Head First C" Griffiths & Griffiths, "C Programming: A Modern Approach" King, "Programming in C" Kochan. Zumindest was so absoluten Beginnerkram angeht.
 
#6
Hallo AGGROStar1991

Ich habe mit C angefangen weil mich Systemnahes programmieren interessiert.
Jetzt lese ich deinen Text und bi etwas verwirrt.
Ich habe "gelesen" das ich, sollte ich mal "C++" lernen wollem (oder auch java), unbedingt mit C anfangen soll.
Als erster Grund wurde mir erklärt, das, um andere Sprachen verstehen zu können, es mehr als empfehlenswert ist mit C zu beginnen. Da ja "Java" "C++" auf "C" aufbauen.
"C" ist zudem kleiner als "C++" daher leichter zu erlernen. Ich lerne "C" aber nicht weil es "leichter" ist als andere. Ich mag herausvorderungen.
Wenn ich ehrlich bin wollte ich "C" und "Java" lernen. Abgeschreckt hat mich an java, das man sich kaum vor's "Decompiieren" schützen kann.
Sicher, ich schreibe noch lang keine Großen Progs. aber irgedwann ..sicher mal.
Anfangs hab ich mit "Pascal" angefangen, da aber rieten mir alle ab. Hab mich dann hingesezt und überlegt; was will ich am ende erreichen.Da kam ich zu "C". Später soll dann "C++" und /oder "Java" kommen.
Leider ließt sich das jetzt so als würde ich mich von jedermann beeinflussen lassen.
Das Problem ist, man findet kaum leute die einem ernsthaft helfen wollen oder etwas ernsthaft empfehlen,und jeder kommt mir am ende mit; lerne "Python"
Mein Ziel ist "C" -> "Java"/"C++"
Und ich mag "C".
Dich zähle ich jetzt aber zu den Mensche die mir ernsthaft Antworten, da du dir für dein Txt zeitgeommen zu haben scheinst. Und am ende keine "Python" empfehlung rausgehauen hast :)
Danke für deine Atwort
Grüße gehen raus.
 

AGGROStar1991

Well-Known Member
c-b Experte
#7
Oh weia, was auch immer du da gelesen hast ist entweder Mist, oder du hast es falsch verstanden.
Zum ein en, je nach dem was für dich Systemnahes Programmieren ist sind alle 3 Sprachen nicht falsch. Wenn du an den Linux-Kernel ran willst gibt es nichts außer C( und C zumindest gut Lesen zu können ist absolut essentiell dafür, da das sozusagen die lingua franca der Programmierer darstellt). Und Java ist dann unumgänglich wenn du auf entspprechenden Systemen bist( zum Beispiel Android).

JAva baut weder auf C noch auf C++ auf. Java teilt Teile der Syntax und sollte sozusagen ein Gegenentwurf zu C++ für bestimmte Anwendungsfelder werde. Ich erkläre das gern mit Sprachen. Nehmen wir an C sei Latein. Dann ist C++ vielleicht Französisch und Java Rumänisch. Niemand würde dir, wenn du dich nicht gerade für Sprachgeschichte interessierst, empfehlen zuerst Latein zu lernen oder behaupten, Rumänisch basiere auf Französisch.

Die Idee C sei leichter zu lernen hält nur dann, wenn man mit lernen etwas komplett anderes meint als ich : wenn das Ziel die Abfragbarkeit aller Sprachmittel und der Standardbibliothek ist, und nicht etwa das tatsächliche Erstellen von Programmen, dann sitmmt das definitiv. Dann ist aber auch Brainfuck leichter als C. Auch hier gibt es wieder die Sprachanalogie : Angenommen du nimmst mir alle Buchstaben außer A und B weg. Dann ist mein Alphabet das ich noch habe zwar kürzer, aber wenn ich damit zum Beispiel den Buchstaben C kodieren will muss ich schon kreativ werden mit so etwas wie "AA". Ich kann damit alles Kodieren, die Bücher werden nur viel länger, es ist fehleranfälliger und man kann es viel schlechter lesen.pro-C

Decompilieren ist irrelevant da es ohnehin nur eine irgendwie ethisch vertretbare Möglichkeit gibt, seine Programme zu teilen, nämlich mit offenem Sourcecode. Alles andere ist über alle maßen bigott und indiskutabel.

Wenn du "Später" C++ lernen willst ist wie schon gesagt zuerst C lernen vollständig sinnlos : du lernst einen Haufen Ballast den du, wenn du einigermaßen brauchbares C++ schreibst, nie wieder verwendest und versaust dir nachhaltig den Stil. Niemand mit Ahnung nimmt an , C sei ein einfaches Subset von C++. Das ist es seit mehr als 25 Jahren(Und damals war C++ noch nicht einmal standardisiert!) nicht mehr.

Es gibt natürlich eine Menge nichttrivialer Programme die in beidem kompiliert werden(sich aber nicht unbedingt identisch verhalten müssen!) aber die sind dann in beiden Sprachen stilistisch furchtbar. Such dir was aus und bleib dabei, der Rest geht schief.

Java ist übrigens von der ähnlichen Syntax abgesehen nicht einmal ungefähr so ähnlich wie C++(Okay oder für die von uns die deklaratives Programmieren gewöhnt sind und predigen : die drei Sprachen machen den gleichen imperativen Unsinn, aber geringfügig anders :p)

Zuerst eine der Skriptsprachen oder noch besser eine der klassischen Lehrsprachen zu lernen ist auch eigentlich kein so schlechter Tipp, aus mehreren Gründen : alles wichtige bringen die dir deutlich direkter bei wenn du dich nicht mit der Sprache selbst rumschlagen musst, es ist deutlich schwerer, sich den Stil zu versauen weil die nicht so viel kram erlauben und ähnliches. Ich hab das Listenbeispiel in C eben angesprochen : niemand sollte sich mehr damit rumschlagen, linked lists zu bauen. Warum auch? Das Problem ist gelöst. Es gibt so viel interessantere. Und das ist eben das Problem : C zwingt einen, sich mit unwichtigen Implementierungsdetails rumzuschlagen.
An dieser Stelle mal die vollständige Liste mit Gründen für C die mir grad einfällt :
- kein C++-Compiler oder keine Toolchain vorhanden
- externe Faktoren( Legay code, Chef diktiert C)
- du bist einer von den vielleicht 100 Leuten auf diesem Planeten die so performancekritischen oder Systemnahen kram machen dass Implementationsinterna im C++-Compiler dir in den Weg kommen würden

Sich von jemandem beeinflussen lassen ist übrigens nichts schlechtes, grad webnn man keine Ahnung hat. Die Frage ist nur : von wem?^^
Ich erwarte übrigens nicht, dass du nun tust was ich sage. Warum auch? Entweder ich habe überzeugende Argumente, oder du entscheidest dich dagegen und fliegst damit vermutlich auf die Nase. Die meisten dieser Sachen die du schreibst habe ich so oft gesehen, hab längst aufgehört zu zählen. Üblcherweise geben Leute die unbedingt mit C anfangen müssen einfach vor dem ersten relevanten Programm frustriert auf und man hört nach ein paar Wochen nie wieder was von denen. Das sei dir eine Mahnung.

P.S. : "Zuerst C lernen" ist so ein Antipattern, dass es sogar schon Talks gibt mit Namen wie Stop teaching C, We stopped teaching C oder Why the programming language C is obsolete

To follow the path, look to the master, follow the master, walk with the master, see through the master, become the master.
 
#8
Hallo.
Ersteinmal danke ich dir für die (ausführliche) Ausführung.

Das erste was ich "Klarstellen" wollte war, das ich mich in einer Sache, falssch ausgedrückt habe und dir somit Arbeit aufgetan habe, sry.
"Java" baut nicht nach der definition "Aufbauen" auf "C". Das war ein falscher Ausdruck. Ich meinte damit, wie du sagst, die Syntax.
Mir ist klar das man "Java" entwickelt hat, um evtl. fehler oder so sache wie das mit der "Carbage Collection" besser zu machen. -Ich hoffe man versteht mich-
Leider muss ich sagen, das ich das nicht falsch verstanden hab. So steht es in dem Buch und auch in vielen foren, das ich "C" als erste Sprache lernen soll, aber der vergleich von dir ist gut, verstehe ich jetzt.
Kommen wir zu dem Punkt, der mich selbst schon lang beschäftig, warum man sich damit rumschlagen sollte -linked lists o. andere vorhandenen Sachen zu bauen-
Ich hatte mir anfags das Programmieren etwas anders vorgestellt, wie kann ich nicht beschreiben. Spass macht es zwar trotzdem aber;
Wenn ich ein etwas größeres Projekt beginne -egal was- kann ich auf Sachen zurückgreifen, die es bereits gibt, ok.
Ist es aber dann noch sein eigenes? (Da man sich ja "Module" oder "Bibliotheken" bedient? Ich möchte nicht dass das Thema ausartet, nur möchte ich ja "alles" selbst machen.
Du wirst mir jetzt sagen, das ich das wohl so sehe, weil ich noch ein anfänger bin. Ich kann es verstehen das man das "Rad" nicht neu erfinden muss/soll, wenn es bereits gute lösungen gibt. Versteh mich nicht falsch, ich muss/werde wohl auch gebrauch von vorgefertigten Sachen machen.
Es ist im grunde nur "Bequemlichkeit" (Möchte keinem zu nahe treten, jeder wie er möchte)
Wenn ich etwas entwickel, dann doch so das ich am Ende sagen kann; Das habe ich gemacht.
Vielleicht ist es aber nur naiv wie ich denke. Ich lerne ja noch und bin auch gewillt (unbedingt) dazu zu lernen.
Wünsche mir, das sich darüber niemand aufregt.Danke

Was "C" angeht, hast du recht. Der Linux kernel interessiert mich.
Gnauso wie "Kryptographie" (Verschlüsselung), "Betriebssysteme" (Dateisysteme) und auch "Android"(sogar sehr).
Insgesammt habe ich das Problem, das ich schon mehrere Bücher zu "C" und "Java" gelesen hab. Auch zu "Pascal" Weil ich mich lange Zeit nicht entscheiden konnte.
Hatte mich aber dazu entschlossen, zu "C" noch "Java"/"C++" zu lernen.

Wenn ich mich richtig erinnere oder verstanden hab, hat doch jede große "IDE" zu den "C"-Compiler auch einen "C++"-Compiler?!
Berichtige wenn falsch.

Deine Argumente sind gut, die ersten die ernst nehmen kann. Wie gesagt hab viel erlebt.
Genauso wie das Thema Decompilieren. Dazu hatte ich mir gestern nochmal gedanken gemacht. Ideen sollte man teilen und "Wissen" -auch- verbreiten (Wenn vorhanden).

Wirklich gute Argumente.
Vielen Dank dafür.
 

AGGROStar1991

Well-Known Member
c-b Experte
#9
Cool. Wer schreibt beim Ziel C++ zu lernen sei zuerst C lernen irgendwie dienlich hat auf mehr als einem Level keinen Plan wovon er redet. Was der Buchautor auch mit seinem "void main()" super vormacht ;) Schon allein weil es pädagogisch vollkommen hirnrissig ist, jemandem erst etwas schwieriges und langwieriges beizubringen das ein hohes Frustrationspotential hat, nur um ihm dann geringfügig später zu sagen "aber so macht man das nicht, also lern jetzt die richtige Version". Im bestmöglichen Verlauf verschwendet der Lerner dann einen Haufen Zeit. Im schlimmsten Fall kriegt er die Stilfehler nie wieder richtig raus. Ich kenne Leute die beim Recruitment Aufgaben für C++ stellen und wenn der Mensch "printf" oder so benutzt ohne dass er einen guten Grund(nicht "But muh performance!!!!!111111") dafür angeben kann fliegt er damit aus dem Test weil das kein angemessenes C++ ist. Selbes Ding mit #define-Konstanten(dem void main sowieso), raw owning pointern, C-Style-Casts und dergleichen mehr.

Wenn dein Ziel irgendwas mit dem Kernel ist... Vergiss C, lern erstmal 5 Jahre irgendwas programmieren, dann gib dir 5 Jahre Informatikgrundlagen und dann denk nochmal drüber nach. Ja das Ding ist tatsächlich so kompliziert. Der Rest ist einfach ein "einmal alles" das funktioniert nicht als Ziel. Crypto ist einfach, da musst du nicht programmieren, das ist hauptsächlich etwas triviale Zahlentheorie, Stochastik und Algebra solang man nichts spannendes damit anfangen will, halt der Grundstoff aus den ersten 3, 4 Semestern Mathematikstudium.

IDEs, zumindest die Guten, haben gar keinen fest damit verdrahteten Compiler, sondern der ist unabhängig von Refactoring, Editor, Highlighting und so weiter austauschbar. Da es nur 7 für den Desktopmarkt relevante C/C++ Compiler gibt(icc(intel), clang, gcc, msvc++(microsoft), nvcc(nvidia), aocc(amd) und open64) von denen einige proprietär und teuer sind und die bis auf einen(der MSVC++, der dich anlügt wenn er sagt er könne C, aber keinen Standard der letzten 25 Jahre unterstützt, ich bin einfach der Meinung die Behauptung es sei eine Unterstützung vorhanden erlischt wenn man 20 Jahre hinterher hängt ;)) alle C und C++ drauf haben ist das de factor der Fall, wenn es auch nicht generell richtig ist : auf embedded Plattformen ist es nicht unüblich dass es nur C-Compiler und Standardbibliotheken gibt, früher war es das auch, und es gab auch mal ein paar frühe IDE's die nur C highlighten konnten(C++ highlighten, linten und derlei ist ein bedeutend schwierigeres Thema und bei Modulen die in C++20 kommen hat noch keiner eine Ahnung, wie man die überhaupt IDE's oder Buildsystemen standardkonform beibringen kann).
Von den Compilern bleiben aus Gründen von Kosten und Praktikabilität vor allem clang, gcc, msvc++(nur auf Windows). Zum letzeren hab ich wenig Gutes zu sagen, aber auch eher wenig Erfahrung mit ihm : mir ist vor allem aufgefallen wie furchtbare und inexistente Warnungen er hat, dass er auch nicht besonders super optimiert, und dass ihn von der CLI aus benutzen ein Krampf ist. GCC ist ein solider Standard der leider aus diversen( auch politischen) Gründen so gebaut ist dass es schwer ist, sinnvolle Erweiterungssoftware dafür zu schreiben. Währenddessen kannst du dir in meinem Tutorial ( findest du in meiner Signatur) angucken was der toolstack um clang und llvm so drauf hat. Besonders super ist, dass die einen Bibliotheksaufbau haben, so daß du beispielsweise libclang auch direkt für deine Software benutzen kannst( zum Beispiel um kleine Tools zu schreiben die deiner IDE das leben leichter machen, da seien der clang-include-fixer oder include-what-you-use genannt die beide extrem klein sind, aber auch größere wie clangd, clang-tidy und clang-format).

mfg
 
Oben