censOred Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 να ρωτήσω κατι.. έχω printf("%d %d %d",fun (&m,k),m,z); (σε καποιο σημειο προγραμματος..) μεσα στην fun αλλαζει h τιμή της m, που δείχνει ο pointer,όπως και το z. μου ζηταει να δωσω τι εκτυπώνει.ο καθηγητης υποστηριζει ότι θα εκτυπωσει νταξει την τιμή της fun,αλλα σε μ και ζ θα εκτυπωούν οι τιμές που είχαν πριν κληθει η συναρτηση.γιατι αυτό?αν μπορει καποιος ετσι στα γρηγορα που ασχολείται.ντανκε ιν αντβανς.
Technology fan Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Έλα ρε συ, πάρε το compiler σου και δες... Αν είναι δυνατόν.. Άμα θέλεις να σου εξηγήσουμε πές μας πρώτα τι βγάζει (μόνο αν πειραματιστείς μαθαίνεις...) Α επίσης πες μας τι κάνει η fun , τα m και z είναι μεταβλητές ή pointers? Και γενικώς βάλε όλο το κώδικα μέσα. Πάντως έτσι όπως το βλέπω, η fun έχει ως πρώτο όρισμα ενα δείκτη που δείχνει στη μεταβλητή m που σημαίνει οτιδήποτε αλλαγή κάνεις στη m μέσα στη συνάρτηση θα πραγματοποιηθεί σε αντίθεση με το δεύτερο όρισμα που ότι και να αλλαγή να γίνει θα ισχύει μόνο τοπικά μεσα στη συνάρτηση...
jtsc21 Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 να ρωτήσω κατι..έχω printf("%d %d %d",fun (&m,k),m,z); (σε καποιο σημειο προγραμματος..) μεσα στην fun αλλαζει h τιμή της m, που δείχνει ο pointer,όπως και το z. μου ζηταει να δωσω τι εκτυπώνει.ο καθηγητης υποστηριζει ότι θα εκτυπωσει νταξει την τιμή της fun,αλλα σε μ και ζ θα εκτυπωούν οι τιμές που είχαν πριν κληθει η συναρτηση.γιατι αυτό?αν μπορει καποιος ετσι στα γρηγορα που ασχολείται.ντανκε ιν αντβανς. δωσε ολο τον κωδικα
teo64x Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Δε χρειάζεται ο κώδικας. Ειπώθηκε ήδη (σε άλλο thread), ότι η συμπεριφορά είναι απροσδιόριστη και αφήνεται στην κρίση του compiler. Ο gcc πάει από δεξιά στα αριστερά.
Technology fan Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Ψάρωσα τώρα ... δε το γνώριζα αυτό και μου φαίνεται χαζό κιόλας τι μπορείς να κερδίσεις αν το κάνεις απο δεξιά στα αριστερά? Η όπως και να χει, δε μπορούσαν να υιοθετήσουν όλοι οι compilers μία λογική? εφόσον στη τελική όλοι το ίδιο πράγμα κάνουν... (σχεδόν)
parsifal Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Ναι, θα μπορούσαν, αν υπήρχε κάποιου είδους άτυπη συμφωνία μεταξύ όλων των compiler developers. Το γεγονός όμως ότι το standard δεν καθορίζει κάτι σχετικά με το θέμα δε βοηθάει και εφόσον ο καθένας είναι ελεύθερος να το υλοποιήσει στον compiler όπως του καπνίσει, το βάρος πέφτει στον προγραμματιστή: Ο τελευταίος οφείλει να γράφει τον κώδικά του με τέτοιο τρόπο ώστε το αποτέλεσμα να είναι σαφώς καθορισμένο και να μην υπάρχει ambiguity.
bxenos Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Μόνο στα comma separated lists και στα logical expressions (π.χ. if) έχουμε συγκεκριμένη φορά υπολογισμών. [αν και στα logical expressions δεν είναι σίγουρο ότι θα γίνουν υπολογισμοί μέχρι τα τελευταία ορίσματα]
C6WGMN Δημοσ. 17 Σεπτεμβρίου 2009 Δημοσ. 17 Σεπτεμβρίου 2009 Μόνο στα comma separated lists και στα logical expressions (π.χ. if) έχουμε συγκεκριμένη φορά υπολογισμών. [αν και στα logical expressions δεν είναι σίγουρο ότι θα γίνουν υπολογισμοί μέχρι τα τελευταία ορίσματα] Και αλλου > int f(void) { int x = 0; { int x = 1, y = x + 1; return y; } } /* f() == 2, never f() == 1 */ βεβαια μοιάζει αρκετά με comma list ώστε και να μην γνωρίζει κάποιος, να το υποθέσει. Το ίδιο ισχύει όμως και για το κάλεσμα συναρτήσεις foo(bar, baz, quux), αλλα εκεί έχουμε διαφορετικούς κανόνες όπως έχει ξαναειπωθεί. Ψάρωσα τώρα ... δε το γνώριζα αυτό και μου φαίνεται χαζό κιόλας τι μπορείς να κερδίσεις αν το κάνεις απο δεξιά στα αριστερά? Η όπως και να χει, δε μπορούσαν να υιοθετήσουν όλοι οι compilers μία λογική? εφόσον στη τελική όλοι το ίδιο πράγμα κάνουν... (σχεδόν) Ένας από τους λόγους για τους οποιους αυτό είναι επιλογή σε αυτόν που θα γράψει ένα C compiler, είναι η αποτελεσματικότητα ως του compiler προς τον χρόνο. Έτσι ο compiler έχει το ελεύθερο για να επιλέξει οποιοδήποτε όρο και να δουλέψει πάνω του άσχετα από τους άλλους ορους (γενικά αυτό είναι περισσότερο αισθητό σε functional γλώσσες)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.