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

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

Δημοσ.

Γεια σας

 

Μπορεί κάποιος να μου εξηγήσει την παρακάτω for γιατι ειμαι τοση ώρα εδώ και δεν καταλαβαίνω γιατι βγάζει αυτά τα αποτελέσματα.. ^_^

 

>
for(i=0, j=10; (i < j) || (i = j-2); i++, --j)
printf("i = %d, j = %d\n",i,j);

Δημοσ.

Η for λειτουργεί ως εξής:

 

>
for ( αρχική πράξη; έλεγχος; τελική πράξη )
{
σώμα της for
}

 

Και η διαδικασία είναι η εξής:

 

  1. Γίνεται η αρχική πράξη
  2. Γίνεται ο έλεγχος

    1. Εάν το αποτέλεσμα είναι διαφορετικό του 0
      1. Εκτελείται το σώμα της for
      2. Εκτελείται η τελική πράξη
      3. Η ροή επιστρέφει στο 2

      [*]Εάν το αποτέλεσμα είναι ίσο με 0

    • Τότε τελειώνει η for

 

Η αρχική και η τελική πράξη δεν είναι μόνο μία "πράξη". Μπορείς να κάνεις "ό,τι θες" εκεί μέσα. Τα διαχωρίζεις με κόμμα ",".


Δημοσ.

Η for λειτουργεί ως εξής:

 

>
for ( αρχική πράξη; έλεγχος; τελική πράξη )
{
σώμα της for
}

 

Και η διαδικασία είναι η εξής:

 

  1. Γίνεται η αρχική πράξη
  2. Γίνεται ο έλεγχος

    1. Εάν το αποτέλεσμα είναι διαφορετικό του 0
      1. Εκτελείται το σώμα της for
      2. Εκτελείται η τελική πράξη
      3. Η ροή επιστρέφει στο 2

      [*]Εάν το αποτέλεσμα είναι ίσο με 0

    • Τότε τελειώνει η for

 

Η αρχική και η τελική πράξη δεν είναι μόνο μία "πράξη". Μπορείς να κάνεις "ό,τι θες" εκεί μέσα. Τα διαχωρίζεις με κόμμα ",".

 

Αυτά τα ξέρω,η συγκεκριμένη for όμως δεν κάνει έναν απλό έλεγχο...


Δημοσ.

Μάλλον το: ... || (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

Δημοσ.

Όχι με τελεστή ανάθεσης είναι...

 

>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.

 

Όσον αφορά το λογικό τελεστή || γίνεται έλεγχος από τα αριστερά προς δεξιά. Επομένως, αν αποτιμηθεί μια συνθήκη ως αληθής οι επόμενες συνθήκες (εντολές) δεν χρειάζεται να ελεγχθούν-εκτελεστούν.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...