codice switch

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Aliys
Prode Principiante
Messaggi: 4
Iscrizione: sabato 28 marzo 2020, 13:56
Desktop: ubuntu
Distribuzione: Ubuntu 18.04.4 LTS x86_64

codice switch

Messaggio da Aliys » sabato 28 marzo 2020, 14:09

Salve a tutti!
Da poco ho iniziato a studiare programmazione nel linguaggio C e, dopo aver letto la spiegazione del codice switch, mi sono accorta di non averlo capito bene, dato che non riesco proprio a capire perché il seguente programma dà come risultato AbcDEF

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>

int main(void){
    char i = 65;
    for(;;) {
        switch (++i) {
            case 'G': printf("%d", i); return EXIT_SUCCESS;
            case 'H': printf("Error!\n"); return EXIT_FAILURE;
            case 'F': break;
            case 'B': printf ("A");
            case 67: printf("%c", i + 32); continue;
            default: printf("%c", i); continue;
        }
        printf("F");
        break;
    }
    return EXIT_SUCCESS;
}
Qualcuno avrebbe la pazienza di spiegarmelo? Da principiante avrei ipotizzato tutt'altro risultato, tipo che nel primo caso viene stampato il numero 65, in H il messaggio Error!, F esce dal ciclo, B stampa A, il caso 67 stampa C dato che in ASCII 67 corrisponde a C e default pensavo stampasse A. Ma come potete vedere la mia ipotesi è tutt'altra rispetto al risultato ottenuto. Mi spiace se è una domanda stupida, ma ragionandoci sopra da sola non sono riuscita a capire il perchè. Grazie in anticipo a chiunque mi sappia aiutare!

Avatar utente
Vincenzo1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 450
Iscrizione: lunedì 14 gennaio 2013, 14:21
Desktop: Unity
Distribuzione: Ubuntu 18.04.3 LTS x86_64
Località: Villabate(PA)
Contatti:

Re: codice switch

Messaggio da Vincenzo1968 » domenica 29 marzo 2020, 18:32

Visto che alla variabile i stiamo applicando l'operatore di preincremento(il lessema ++posto alla sinistra delle variabile i),
all'interno del ciclo for la variabile i vale 66(65 preincrementato di 1 = 66).
Quindi si ha:

Prima iterazione:
i vale 66, che corrisponde al codice ascii 'B', quindi viene eseguito il ramo case 'B', cioè:
stampa 'A' e passa a eseguire il ramo case 67 visto che il ramo case 'A' non contiene l'istruzione break.
Quindi il programma stampa il carattere corrispondente al codice ascii 98(66 + 32) e cioè b.
A questo punto abbiamo l'istruzione continue che porta il punto di esecuzione del programma all'inizio del ciclo for.

Seconda iterazione:
La variabile i viene (pre)incrementata di 1, quindi è uguale a 67, e viene eseguito il ramo case 67:
stampa il carattere corrispondente al codice ascii 99(67 + 32) e cioè il carattere c.
L'istruzione continue ci porta di nuovo all'inizio del ciclo for.

Terza iterazione:
La variabile i viene (pre)incrementata di 1, quindi è uguale a 68(che corrisponde al carattere D), e viene eseguito il ramo default:
stampa il carattere associato al codice ascii 68, cioè D.
L'istruzione successiva, continue ci porta alla

Quarta iterazione:
La variabile i viene (pre)incrementata di 1, quindi è uguale a 69(che corrisponde al carattere E), e viene eseguito il ramo default:
stampa il carattere associato al codice ascii 68, cioè E.
L'istruzione successiva, continue ci porta alla

Quinta iterazione:
La variabile i viene (pre)incrementata di 1, quindi è uguale a 70(che corrisponde al carattere F), e viene eseguito il ramo case 'F'::
abbiamo l'istruzione break che ci fa uscire dal blocco switch;
vengono eseguite le due istruzioni al di fuori di tale blocco:

printf("F");
break;

L'ultima istruzione eseguita, break, ci porta fuori dal ciclo for e il programma termina restituendo EXIT_SUCCESS.
È ormai difficile incontrare un cretino che non sia intelligente e un intelligente che non sia un cretino. [...] Oh i bei cretini di una volta! Genuini, integrali. Come il pane di casa. Come l'olio e il vino dei contadini. (da "Nero su nero" di Leonardo Sciascia)

Aliys
Prode Principiante
Messaggi: 4
Iscrizione: sabato 28 marzo 2020, 13:56
Desktop: ubuntu
Distribuzione: Ubuntu 18.04.4 LTS x86_64

Re: codice switch

Messaggio da Aliys » domenica 29 marzo 2020, 19:14

Ti ringrazio davvero tanto, soprattutto per la pazienza per avermi spiegato tutto passo dopo passo, sei stato chiarissimo! Adesso ho capito come funziona lo switch :D

Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti