C Warum kommt hier bitte 23 raus? :/

Status
Für weitere Antworten geschlossen.

elektro2

Cadet 4th Year
Registriert
Feb. 2014
Beiträge
67
Code:
#include <stdio.h>

#define square(x) x*x


int main(void){

    int a = square(2+7);
    
    printf("%d", a);
    
    
    
    
    return 0;
}
 
Überleg mal was das Ergebnis von 2 + 7 * 2 + 7 ist, dann solltest du selbst auf die Lösung kommen ;)
 
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.)
was soll denn bitte "#define square(x) x*x" bewirken? da wird als input statt x einfach x² genommen?
 
Ah ok Danke :D

Ich habe natürlich nicht " outside the box " gedacht :D Habe immer x=2+7 zusammengefasst, also 9
und bin dann in die Funktion reingegangen
 
Du hättest das natürlich mit

#define square(x) (x)*(x)

vermeiden können.
 
wie wäre es mit
#define square(x) (x)*(x)
 
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.
 
Wie antred bereits schrieb, wäre eine Lösung Präprozessor vorzuziehen, z.B. so:

Code:
#include <stdio.h>
     
double square(double x) {
    return x*x;
}
      
int main(void){     
    int a = square(2+7);
    printf("%d", a);
    return 0;
}
 
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.
 
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.
Zurück
Oben