Leuteris Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Γεια σας Μπορεί κάποιος να μου εξηγήσει την παρακάτω for γιατι ειμαι τοση ώρα εδώ και δεν καταλαβαίνω γιατι βγάζει αυτά τα αποτελέσματα.. > for(i=0, j=10; (i < j) || (i = j-2); i++, --j) printf("i = %d, j = %d\n",i,j);
Timonkaipumpa Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Η for λειτουργεί ως εξής: > for ( αρχική πράξη; έλεγχος; τελική πράξη ) { σώμα της for } Και η διαδικασία είναι η εξής: Γίνεται η αρχική πράξη Γίνεται ο έλεγχος Εάν το αποτέλεσμα είναι διαφορετικό του 0 Εκτελείται το σώμα της for Εκτελείται η τελική πράξη Η ροή επιστρέφει στο 2 [*]Εάν το αποτέλεσμα είναι ίσο με 0 Τότε τελειώνει η for Η αρχική και η τελική πράξη δεν είναι μόνο μία "πράξη". Μπορείς να κάνεις "ό,τι θες" εκεί μέσα. Τα διαχωρίζεις με κόμμα ",".
Leuteris Δημοσ. 22 Δεκεμβρίου 2011 Μέλος Δημοσ. 22 Δεκεμβρίου 2011 Η for λειτουργεί ως εξής: > for ( αρχική πράξη; έλεγχος; τελική πράξη ) { σώμα της for } Και η διαδικασία είναι η εξής: Γίνεται η αρχική πράξη Γίνεται ο έλεγχος Εάν το αποτέλεσμα είναι διαφορετικό του 0 Εκτελείται το σώμα της for Εκτελείται η τελική πράξη Η ροή επιστρέφει στο 2 [*]Εάν το αποτέλεσμα είναι ίσο με 0 Τότε τελειώνει η for Η αρχική και η τελική πράξη δεν είναι μόνο μία "πράξη". Μπορείς να κάνεις "ό,τι θες" εκεί μέσα. Τα διαχωρίζεις με κόμμα ",". Αυτά τα ξέρω,η συγκεκριμένη for όμως δεν κάνει έναν απλό έλεγχο...
migf1 Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Μάλλον το: ... || (i = j-2) το εννοούσες: ... || (i == j-2) Το σκέτο = είναι τελεστής ανάθεσης και όχι σύγκρισης.
Leuteris Δημοσ. 22 Δεκεμβρίου 2011 Μέλος Δημοσ. 22 Δεκεμβρίου 2011 Μάλλον το: ... || (i = j-2) το εννοούσες: ... || (i == j-2) Το σκέτο = είναι τελεστής ανάθεσης και όχι σύγκρισης. Όχι με τελεστή ανάθεσης είναι για αυτό δεν καταλαβαίνω τι κάνει... >int i, j; for(i=0, j=10; (i < j) || (i = j-2); i++, --j) printf("i = %d, j = %d\n",i,j); printf("i = %d, j = %d\n",i,j); Αποτελέσματα: i = 0, j = 10 i = 1, j = 9 i = 2, j = 8 i = 3, j = 7 i = 4, j = 6 i = 3, j = 5 i = 2, j = 4 i = 1, j = 3 i = 0, j = 2
npapanik Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Όχι με τελεστή ανάθεσης είναι... >int i, j; for(i=0, j=10; (i < j) || (i = j-2); i++, --j) printf("i = %d, j = %d\n",i,j); printf("i = %d, j = %d\n",i,j); Αποτελέσματα: i = 0, j = 10 i = 1, j = 9 i = 2, j = 8 i = 3, j = 7 i = 4, j = 6 i = 3, j = 5 i = 2, j = 4 i = 1, j = 3 i = 0, j = 2 Στις πρώτες 5 επαναλήψεις γίνεται απολογισμός μόνο της έκφρασης (i<j). Αντίθετα, η ανάθεση αρχίζει και εκτελείται στην έκτη επανάληψη και έπειτα (όπου η έκφραση i<j δεν ισχύει). Γενικά η συνολική συνθήκη (i < j) || (i = j-2) από την έκτη επανάληψη και μετά αποτιμάται ως αληθής - όσο το i παίρνει τιμές διάφορες του μηδενός -. Μόλις αυτό πάρει την τιμή 0 τότε όλη η συνθήκη αποτιμάται ως ψευδής και τερματίζεται η for(). Επίσης, έχει ενδιαφέρον να δοκιμάσεις να αλλάξεις τη δειρά της συνθήκης -> (i = j-2) || (i < j). Το αποτέλεσμα θα είναι ένα ατέρμονο loop. Όσον αφορά το λογικό τελεστή || γίνεται έλεγχος από τα αριστερά προς δεξιά. Επομένως, αν αποτιμηθεί μια συνθήκη ως αληθής οι επόμενες συνθήκες (εντολές) δεν χρειάζεται να ελεγχθούν-εκτελεστούν.
Leuteris Δημοσ. 22 Δεκεμβρίου 2011 Μέλος Δημοσ. 22 Δεκεμβρίου 2011 Ευχαριστώ npapanik,κάπως έτσι το σκευτόμουν..το βρήκα τώρα.
npapanik Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Ευχαριστώ npapanik,κάπως έτσι το σκευτόμουν..το βρήκα τώρα. you're welcome!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα