Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C Warum kommt hier bitte 23 raus? :/
- Ersteller elektro2
- Erstellt am
- Status
- Für weitere Antworten geschlossen.
Simpson474
Fleet Admiral
- Registriert
- Sep. 2006
- Beiträge
- 12.782
Überleg mal was das Ergebnis von 2 + 7 * 2 + 7 ist, dann solltest du selbst auf die Lösung kommen
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
elektro2 schrieb:Code:#include <stdio.h> #define square(x) x*x int main(void){ int a = square(2+7); printf("%d", a); return 0; }
Weil der Präprozessor nix weiter als eine stupide textuelle Ersetzung macht. Die Zeile
int a = square( 2 + 7 ); wird vom Präprozessor umgewandelt in
int a = 2 + 7 * 2 + 7;, und da Punktrechnung vor Strichrechnung geht, ergibt das nun mal 23.
EDIT: Einer der Gründe, weshalb der Präprozessor pfui ist und man ihn nur nutzen sollte, wenn's überhaupt nicht anders geht.
Zuletzt bearbeitet:
(Typos.)
Simpson474
Fleet Admiral
- Registriert
- Sep. 2006
- Beiträge
- 12.782
Und damit quadriert - dürfte wohl auch der Sinn von dem Macro sein.mullmanu schrieb:was soll denn bitte "#define square(x) x*x" bewirken? da wird als input statt x einfach x² genommen?
noch besser waere
#define square(x) ((x)*(x))
in dem Fall mit der * drinne nicht so tragisch, aber bei Operationen mit niederer Priotitaet bekommt man wieder
ein Problem wenn man dasin komplexeren Ausdrucken einsetzt, wenn man die extra () nicht macht.
Also besser gleich so angewoehnen.
#define square(x) ((x)*(x))
in dem Fall mit der * drinne nicht so tragisch, aber bei Operationen mit niederer Priotitaet bekommt man wieder
ein Problem wenn man dasin komplexeren Ausdrucken einsetzt, wenn man die extra () nicht macht.
Also besser gleich so angewoehnen.
asdfman
Commander
- Registriert
- März 2008
- Beiträge
- 2.315
Eine Funktion bauen, um nur einen Ausdruck abzuarbeiten? Warum genau wäre das vorzuziehen? Mehr Schreibarbeit und man kann auch nicht garantieren, dass der Compiler es inlinet, was am Ende unnötigen Overhead zur Folge hat.
Der kümmerliche Ausdruck da erfüllt nicht den Zweck, für den eine Funktion in der imperativen Programmierung da ist.
Das als Makro zu implementieren ist die einzig vernünftige Lösung. Man muss nur eben einmal lernen, wie man das richtig macht und das hat OP ja jetzt.
Der kümmerliche Ausdruck da erfüllt nicht den Zweck, für den eine Funktion in der imperativen Programmierung da ist.
Das als Makro zu implementieren ist die einzig vernünftige Lösung. Man muss nur eben einmal lernen, wie man das richtig macht und das hat OP ja jetzt.
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
asdfman schrieb:Eine Funktion bauen, um nur einen Ausdruck abzuarbeiten? Warum genau wäre das vorzuziehen? Mehr Schreibarbeit und man kann auch nicht garantieren, dass der Compiler es inlinet, was am Ende unnötigen Overhead zur Folge hat.
Der kümmerliche Ausdruck da erfüllt nicht den Zweck, für den eine Funktion in der imperativen Programmierung da ist.
Der Compiler wird's inlinen, wenn er meint, daß es effizienter ist, als es nicht zu tun. Meistens liegt der Compiler mit seiner Einschätzung näher an der Realität. Und wenn man sich seiner Sache ganz sicher ist und meint, das muß jetzt aber unbedingt geinline't werden, gibt's ja immer noch diverse compiler-spezifische Direktiven, mit denen man das inlinen erzwingen kann.
- Status
- Für weitere Antworten geschlossen.
Ähnliche Themen
- Antworten
- 6
- Aufrufe
- 766
- Antworten
- 5
- Aufrufe
- 1.302
- Antworten
- 31
- Aufrufe
- 3.740