Προς το περιεχόμενο

Τι θα εκτυπωσει στην C?


censOred

Προτεινόμενες αναρτήσεις

Δημοσ.

να ρωτήσω κατι..

έχω printf("%d %d %d",fun (&m,k),m,z); (σε καποιο σημειο προγραμματος..)

μεσα στην fun αλλαζει h τιμή της m, που δείχνει ο pointer,όπως και το z.

μου ζηταει να δωσω τι εκτυπώνει.ο καθηγητης υποστηριζει ότι θα εκτυπωσει νταξει την τιμή της fun,αλλα σε μ και ζ θα εκτυπωούν οι τιμές που είχαν πριν κληθει η συναρτηση.γιατι αυτό?αν μπορει καποιος ετσι στα γρηγορα που ασχολείται.ντανκε ιν αντβανς.

Δημοσ.

Έλα ρε συ, πάρε το compiler σου και δες... Αν είναι δυνατόν.. Άμα θέλεις να σου εξηγήσουμε πές μας πρώτα τι βγάζει :P (μόνο αν πειραματιστείς μαθαίνεις...)

 

Α επίσης πες μας τι κάνει η fun , τα m και z είναι μεταβλητές ή pointers? Και γενικώς βάλε όλο το κώδικα μέσα.

 

Πάντως έτσι όπως το βλέπω, η fun έχει ως πρώτο όρισμα ενα δείκτη που δείχνει στη μεταβλητή m που σημαίνει οτιδήποτε αλλαγή κάνεις στη m μέσα στη συνάρτηση θα πραγματοποιηθεί σε αντίθεση με το δεύτερο όρισμα που ότι και να αλλαγή να γίνει θα ισχύει μόνο τοπικά μεσα στη συνάρτηση...

Δημοσ.
να ρωτήσω κατι..

έχω printf("%d %d %d",fun (&m,k),m,z); (σε καποιο σημειο προγραμματος..)

μεσα στην fun αλλαζει h τιμή της m, που δείχνει ο pointer,όπως και το z.

μου ζηταει να δωσω τι εκτυπώνει.ο καθηγητης υποστηριζει ότι θα εκτυπωσει νταξει την τιμή της fun,αλλα σε μ και ζ θα εκτυπωούν οι τιμές που είχαν πριν κληθει η συναρτηση.γιατι αυτό?αν μπορει καποιος ετσι στα γρηγορα που ασχολείται.ντανκε ιν αντβανς.

 

δωσε ολο τον κωδικα

Δημοσ.

Ψάρωσα τώρα ... δε το γνώριζα αυτό και μου φαίνεται χαζό κιόλας τι μπορείς να κερδίσεις αν το κάνεις απο δεξιά στα αριστερά? Η όπως και να χει, δε μπορούσαν να υιοθετήσουν όλοι οι compilers μία λογική? εφόσον στη τελική όλοι το ίδιο πράγμα κάνουν... (σχεδόν)

Δημοσ.

Ναι, θα μπορούσαν, αν υπήρχε κάποιου είδους άτυπη συμφωνία μεταξύ όλων των compiler developers. Το γεγονός όμως ότι το standard δεν καθορίζει κάτι σχετικά με το θέμα δε βοηθάει και εφόσον ο καθένας είναι ελεύθερος να το υλοποιήσει στον compiler όπως του καπνίσει, το βάρος πέφτει στον προγραμματιστή: Ο τελευταίος οφείλει να γράφει τον κώδικά του με τέτοιο τρόπο ώστε το αποτέλεσμα να είναι σαφώς καθορισμένο και να μην υπάρχει ambiguity.

Δημοσ.

Μόνο στα comma separated lists και στα logical expressions (π.χ. if) έχουμε συγκεκριμένη φορά υπολογισμών. [αν και στα logical expressions δεν είναι σίγουρο ότι θα γίνουν υπολογισμοί μέχρι τα τελευταία ορίσματα]

Δημοσ.
Μόνο στα 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 γλώσσες)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...