Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente bannato
    Registrato dal
    Jun 2004
    Messaggi
    274

    [C] differenza i++ e ++i

    Non ho capito appieno la differenza fra i++ e ++i

    ++i il valore è calcolato prima che l'espressione sia calcolata e viceversa

    ma ..

    nt power(int y,int x)
    {
    int j=1, p=(x?y:1);//se l'esponente è zero assegno il valore 1
    while (j++<x)
    p*=y; //p=p*base
    return p;
    }

    while(j++ < x)

    in questo caso quando entra ... j++ vale 2 ?

    e poi un altra cosa

    p = (x?y:1) cosa significa ?? cioè lo so che è un operatore ternario , l'if , ma non riesco a capire come funziona in questo caso ..

    thanks !

  2. #2

    Re: [C] differenza i++ e ++i

    Originariamente inviato da ^NeXsUs^
    while(j++ < x)

    in questo caso quando entra ... j++ vale 2 ?
    In questo caso , trattandosi di un incremento post-fisso , viene valutato prima il confronto , e successivamente viene incrementata la variabile j . Tale codice è equivalente al seguente :
    codice:
    while (j<x)
    {
     ...
     j+=1
    }
    Originariamente inviato da ^NeXsUs^
    e poi un altra cosa

    p = (x?y:1) cosa significa ?? cioè lo so che è un operatore ternario , l'if , ma non riesco a capire come funziona in questo caso ..
    Semplice . Se x è diverso da zero p assume il valore di y , altrimenti viene settato a 1 .

    Saluti

  3. #3
    i++ restituisce il valore di i e incrementa i di uno;
    codice:
    printf("%d",i++);
    corrisponde a
    codice:
    printf("%d",i);
    i+=1 //o, se preferisci, i=i+1.
    ++i incrementa i di uno e restituisce il valore di i;
    codice:
    printf("%d",++i);
    corrisponde a
    codice:
    i+=1; //o, se preferisci, i=i+1.
    printf("%d",i);
    .
    Quanto all'operatore "?", esso funziona in maniera simile alla formula "SE" di Excel: se l'espressione che precede "?" è vera allora restituisce l'espressione che segue ?, altrimenti restituisce l'espressione che segue i due punti.
    codice:
    int i;
    printf("%d",i?1:2); //Visualizza 2
    i=1;
    printf("%d",i?1:2); //Visualizza 1
    E ora, per vedere se hai capito:
    codice:
    int i;
    printf("%d",i++?1:2);
    Cosa visualizzerà?
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Azz... battuto sul tempo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente bannato
    Registrato dal
    Jun 2004
    Messaggi
    274
    int i;
    printf("%d",i++?1:2);
    visualizza 2 e incrementa i

    giusto ??

    Non punitemi

    Approfittando della vostra gentilezza

    printf("\nRisultato con il 2° algoritmo: [");
    for (i=7;i>=0;i--)
    printf(" %d",!!((1<<i)&nn)); <------ hem -.- ??
    printf(" ]\n");

  6. #6
    Originariamente inviato da ^NeXsUs^
    visualizza 2 e incrementa i

    giusto ??
    Giusto!
    Non punitemi

    Approfittando della vostra gentilezza

    printf("\nRisultato con il 2° algoritmo: [");
    for (i=7;i>=0;i--)
    printf(" %d",!!((1<<i)&nn)); <------ hem -.- ??
    printf(" ]\n");
    Hem... piuttosto ingarbugliato; isola il bit i di nn e ne effettua il not due volte (?!?).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da ^NeXsUs^
    visualizza 2 e incrementa i

    giusto ??

    Non punitemi

    Approfittando della vostra gentilezza

    printf("\nRisultato con il 2° algoritmo: [");
    for (i=7;i>=0;i--)
    printf(" %d",!!((1<<i)&nn)); <------ hem -.- ??
    printf(" ]\n");
    La for e l'espressione nella printf servono ad effettuare la conversione decimale-binario.

    Per ogni bit in un byte (da 7 a 0) viene fatto

    1) lo shift a sinistra del valore 1 per il numero di bit equivalenti al contatore. Durante il ciclo dallo shift 1<<i si otterranno i valori

    128 (1<<7)
    64 (1<<6)
    32 (1<<5)
    16 (1<<4)
    8 (1<<3)
    4 (1<<2)
    2 (1<<1)
    1 (1<<0)

    2) ad ogni giro del ciclo, veiene effettuato l'and bit at bit con il valore nn che e' quello da convertire. Si otterra' 0 se il bit corrispondente e' a 0, uno dei valori indicati nella colonna precedente se il bit e' a 1. Ad esempio, se nn vale 170 si avra' il risultato

    128
    0
    32
    0
    8
    0
    2
    0

    3) il primo not fatto sul risultato dell'espressione restituisce 0 per qualsiasi valore diverso da 0 e 1 per il valore 0. Si ha quindi

    0 (!128)
    1 (!0)
    0 (!32)
    1 (!0)
    0 (!8)
    1 (!0)
    0 (!2)
    1 (!0)

    4) a questo punto pero' il risultato e' invertito rispetto al risultato effettivo e quindi il secondo not rimette tutto a posto

    1 (!0)
    0 (!1)
    1 (!0)
    0 (!1)
    1 (!0)
    0 (!1)
    1 (!0)
    0 (!1)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.