i++ vs ++i in C

Jinku Hu 12 ottobre 2023
  1. Principali differenze tra le notazioni ++i e ++i in C
  2. Usa la notazione ++i come stile comunemente accettato per le istruzioni di loop in C
i++ vs ++i in C

Questo articolo spiegherà diversi metodi per utilizzare gli operatori di incremento prefisso vs suffisso, alias i++ vs i++, in C.

Principali differenze tra le notazioni ++i e ++i in C

La parte fondamentale di queste due notazioni è l’operatore unario di incremento ++ che aumenta il suo operando, ad es. i, di 1. L’operatore di incremento può precedere l’operando come prefisso i o dopo l’operando come operatore suffisso - i.

Un comportamento leggermente insolito si verifica quando il valore della variabile incrementato con l’operatore ++ viene utilizzato in un’espressione. In questo caso, gli incrementi di prefisso e suffisso si comportano in modo diverso. Vale a dire, l’operatore prefisso incrementa il suo operando prima che il suo valore venga utilizzato, mentre l’operatore suffisso incrementa l’operando dopo che il valore è stato utilizzato.

Di conseguenza, la funzione printf che usa l’espressione i++ come argomento stamperà il valore di i prima che venga incrementato di uno. D’altra parte, printf con l’operatore di incremento prefisso i++ stamperà il valore incrementato, che sarà 1 alla prima iterazione come mostrato nel seguente codice di esempio.

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

int main() {
  int i = 0, j = 0;

  while ((i < 5) && (j < 5)) {
    /*
    postfix increment, i++
    the value of i is read and then incremented
    */
    printf("i: %d\t", i++);
    /*
    prefix increment, ++j
    the value of j is incremented and then read
    */
    printf("j: %d\n", ++j);
  }

  printf("At the end they have both equal values:\ni: %d\tj: %d\n\n", i, j);

  exit(EXIT_SUCCESS);
}

Produzione:

i: 0	j: 1
i: 1	j: 2
i: 2	j: 3
i: 3	j: 4
i: 4	j: 5
At the end they have both equal values:
i: 5	j: 5

Usa la notazione ++i come stile comunemente accettato per le istruzioni di loop in C

Gli operatori di suffisso e prefisso hanno lo stesso comportamento funzionale quando usati nell’istruzione del cicli for. Poiché le due iterazioni for vengono eseguite nel codice di esempio riportato di seguito, stampano i valori di k in modo identico.

Si noti che ci sono diverse affermazioni sulla migliore efficienza delle prestazioni dell’uso dell’incremento del prefisso rispetto al suffisso nei cicli for, ma la differenza di tempo effettiva nella maggior parte delle applicazioni sarà trascurabile. Possiamo prendere l’abitudine di usare l’operatore prefisso come metodo preferito come stile comunemente accettato.

Ma se stai già usando la notazione postfissa, considera che l’uso di compilatori moderni con i flag di ottimizzazione corrispondenti eliminerà automaticamente le iterazioni di loop inefficienti.

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

int main() {
  for (int k = 0; k < 5; ++k) {
    printf("%d ", k);
  }
  printf("\n");
  for (int k = 0; k < 5; k++) {
    printf("%d ", k);
  }
  printf("\n\n");

  exit(EXIT_SUCCESS);
}

Produzione:

0 1 2 3 4
0 1 2 3 4
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C Operator