# \[RISOLTO\] Dubbio funzione for

**URL:** <https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750>\
**Category:** Software\
**Created:** [November 20, 2018, 5:18pm UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750 "2018-11-20T17:18:25Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![LeoTer01](https://avatars.discourse-cdn.com/v4/letter/l/258eb7/32.png) [@LeoTer01](https://forum.arduino.cc/u/LeoTer01)\
**Post date:** [November 20, 2018, 5:18pm UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/1 "2018-11-20T17:18:25Z")

</div>

Ciao a tutti, c'è qualcuno di buona volontà che mi potrebbe spiegare questa riga di codice, o meglio, ho capito che pone la variabile i a 0 poi dice, finchè i è minore di 255.....ecco, l'ultima parte non l'ho capita.

```cpp
for( int i = 0 ; i < 255 ; i += 1 ){

```

Grazie  
Leo

---

<div class="post-metadata">

**Author:** ![SukkoPera](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/sukkopera/32/215233_2.png) [@SukkoPera](https://forum.arduino.cc/u/SukkoPera)\
**Post date:** [November 20, 2018, 5:31pm UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/2 "2018-11-20T17:31:33Z")

</div>

Incrementa i. Solitamente si scrive i++ o ++i (con significato leggermente diverso ma non in questo contesto), ma i += 1 è una forma equivalente.

PS: for è un'istruzione, non una funzione.

---

<div class="post-metadata">

**Author:** ![LeoTer01](https://avatars.discourse-cdn.com/v4/letter/l/258eb7/32.png) [@LeoTer01](https://forum.arduino.cc/u/LeoTer01)\
**Post date:** [November 20, 2018, 5:32pm UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/3 "2018-11-20T17:32:31Z")

</div>

Perfetto, grazie mille!

Leo

---

<div class="post-metadata">

**Author:** ![Silente](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/silente/32/274049_2.png) [@Silente](https://forum.arduino.cc/u/Silente)\
**Post date:** [November 20, 2018, 6:42pm UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/4 "2018-11-20T18:42:17Z")

</div>

Se non ho capito male variabile segno = numero é come dire variabile= variabile segno numero

---

<div class="post-metadata">

**Author:** ![torn24](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/torn24/32/1013044_2.png) [@torn24](https://forum.arduino.cc/u/torn24)\
**Post date:** [November 21, 2018, 5:59am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/5 "2018-11-21T05:59:55Z")

</div>

Gli operatori di incremento e decremento i++ i-- , dovrebbero corrispondere a un codice macchina più semplice "mi pare un unica istruzione", per cui sono da preferire.  
Nei cicli for() a volte capita di dover incrementare di valori superiori all'unità, allora in quel caso si usa +=.

In definitiva se devi incrementare di uno è meglio usare i++ , se devi incrementare di valori superiori allora

usi += 🙂 🙂

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [November 21, 2018, 6:07am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/6 "2018-11-21T06:07:20Z")

</div>

> torn24:  
> Gli operatori di incremento e decremento i++ i-- , dovrebbero corrispondere a un codice macchina più semplice ...

... oggigiorno qualsiasi compilatore un po' furbo (_e gcc è piuttosto furbo_) tratta **i+=1** come **i++**. 😉

Guglielmo

---

<div class="post-metadata">

**Author:** ![torn24](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/torn24/32/1013044_2.png) [@torn24](https://forum.arduino.cc/u/torn24)\
**Post date:** [November 21, 2018, 6:40am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/7 "2018-11-21T06:40:00Z")

</div>

Buono a sapersi Guglielmo 🙂

Era una cosa che avevo letto da qualche parte! Dove diceva che alcune istruzioni del C venivano tradotte in un unica istruzione in assembly, e faceva proprio l'esempio degli operatori di incremento 🙂  
Ma non conosco l'assembly e non ho mai visionato il codice assembly di un codice C...

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [November 21, 2018, 7:50am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/8 "2018-11-21T07:50:19Z")

</div>

> torn24:  
> Era una cosa che avevo letto da qualche parte! Dove diceva che alcune istruzioni del C venivano tradotte in un unica istruzione in assembly ...

Vero, ma devi sempre considerare le altre istruzioni che servono a recuperare la variabile e poi a salvarla, quindi, un banale **i++** o **i+=1** (_ma rimane valido per qualsiasi valore_), ottimizzando al massimo, con una variabile di tipo intero non segnata comporta comunque cinque istruzioni assembler ...

```arduino
lds r24, 0x0100   // recupera il primo byte dell'intero e lo mette in r24
lds r25, 0x0101   // recupera il secondo byte dell'intero e lo mette in r25
adiw r24, 0x01    // somma il valore 1 alla word che ora si trova in r24 e r25
sts 0x0101, r25   // salva il secondo byte da r25
sts 0x0100, r24   // salva il primo byte da r24

```

... come vedi, l'incremento (_o la somma di un valore_) è effettivamente fatto con una singola istruzione macchina, ma intorno c'è dell'altro e alla fine, comunque, almeno 5 istruzioni devi fare.

Guglielmo

---

<div class="post-metadata">

**Author:** ![SukkoPera](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/sukkopera/32/215233_2.png) [@SukkoPera](https://forum.arduino.cc/u/SukkoPera)\
**Post date:** [November 21, 2018, 9:01am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/9 "2018-11-21T09:01:46Z")

</div>

Voglio sperare che un compilatore furbo:

- Si renda conto che basta un byte per rappresentare tutti i valori assunti dalla variabile
- La mantenga in un registro all'interno del for (a meno di necessità particolari)

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [November 21, 2018, 9:15am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/10 "2018-11-21T09:15:16Z")

</div>

**\>SukkoPera:** il caso riportato **NON** è relativo ad un ciclo for, ma alle due operazioni indicate. Quanto all'ampiezza dell'indice è l'utente che lo impone dichiarando la variabile del for, NON il compilatore ... se gli dici che i è int e poi vai solo da 0 a 255 userà sempre e comunque 2 bytes del int che hai dichiarato e non 1 ... :🙂

Guglielmo

---

<div class="post-metadata">

**Author:** ![SukkoPera](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/sukkopera/32/215233_2.png) [@SukkoPera](https://forum.arduino.cc/u/SukkoPera)\
**Post date:** [November 21, 2018, 9:29am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/11 "2018-11-21T09:29:07Z")

</div>

Sì, ma in un caso come quello proposto, in cui 0 \<= i \<= 255, e supponendo che i non venga modificato all'interno del loop, non vedo perché un compilatore non possa rendersi conto che basta un singolo byte e ottimizzare!

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [November 21, 2018, 10:31am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/12 "2018-11-21T10:31:32Z")

</div>

**\>Sukkopera:** non ottimizza, rispetta le scelte dell'utente ...

Preso un programmino stupido come questo:

```cpp
volatile int a;
int i;

void setup() __attribute__ ((optimize("-O3")));
void setup() {
  // put your setup code here, to run once:
  
  for(i=0; i<255;i++) {
  a += i;
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

```

in cui ho:

1. forzato l'aggiornamneto di 'a' dichiarandola 'volatile' (_altrimenti il compilatore che è furbo, vendendo che non era utilizzato nulla, buttava tutto_)
2. per il setup() ho richiesto il massimo dell'ottimizzazione per la velocità (-O3)

... produce il seguente assembler:

```cpp
00000090 <setup>:
  90:	80 e0      ldi	r24, 0x00	; 0
  92:	90 e0      ldi	r25, 0x00	; 0
  94:	20 91 00 01 lds	r18, 0x0100
  98:	30 91 01 01 lds	r19, 0x0101
  9c:	28 0f      add	r18, r24
  9e:	39 1f      adc	r19, r25
  a0:	30 93 01 01 sts	0x0101, r19
  a4:	20 93 00 01 sts	0x0100, r18
  a8:	01 96      adiw	r24, 0x01	; 1
  aa:	8f 3f      cpi	r24, 0xFF	; 255
  ac:	91 05      cpc	r25, r1
  ae:	91 f7      brne	.-28    ; 0x94 <setup+0x4>
  b0:	90 93 03 01 sts	0x0103, r25
  b4:	80 93 02 01 sts	0x0102, r24
  b8:	08 95      ret

```

... dove, come puoi ben vedere, usa per la variabile 'i' intera i due registri r24 e r25 che inizializza a zero, effettua una add word di 1 sul numero che sta a partire da r24 e effettua il compare con il 255.

Guglielmo

---

<div class="post-metadata">

**Author:** ![SukkoPera](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/sukkopera/32/215233_2.png) [@SukkoPera](https://forum.arduino.cc/u/SukkoPera)\
**Post date:** [November 21, 2018, 10:37am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/13 "2018-11-21T10:37:07Z")

</div>

Uhm, ma questo è perché all'interno del for deve sommare i con a che è comunque un int.

Prova una cosa tipo:

```cpp
for(i=0; i<255;i++) {
   Serial.println("Ciao");
}

```

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [November 21, 2018, 10:42am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/14 "2018-11-21T10:42:47Z")

</div>

Ovvio che SI ...  
... se difatti dichiari la variabile 'a' di un byte e lasci 'i' come int, l'assembler equivalente, nel for, è ottimizzato ad utilizzare solo il byte meno significativo dell'int (_che comunque è e resta un int_) che gli basta e gli avanza 😉

Insomma ... dipende molto dal programma, anche se tu vai solo fino a 255, ma coinvolgi nelle operazioni qualche cosa di più grande di un byte, lui, pur sapendo che arriva sino a 255, utilizza tutto l'int, se invece coinvolgi un byte, allora usa solo quello che serve 🙂

Guglielmo

---

<div class="post-metadata">

**Author:** ![SukkoPera](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/sukkopera/32/215233_2.png) [@SukkoPera](https://forum.arduino.cc/u/SukkoPera)\
**Post date:** [November 21, 2018, 10:48am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/15 "2018-11-21T10:48:55Z")

</div>

Ah beh, certo! È quello che intendevo con questo:

> SukkoPera:  
> Sì, ma in un caso come quello proposto, in cui 0 \<= i \<= 255, e supponendo che i non venga **modificato** all'interno del loop, non vedo perché un compilatore non possa rendersi conto che basta un singolo byte e ottimizzare!

Dove però "modificato" non era la parola giusta. 😰

---

<div class="post-metadata">

**Author:** ![Standardoil](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/standardoil/32/1286411_2.png) [@Standardoil](https://forum.arduino.cc/u/Standardoil)\
**Post date:** [November 21, 2018, 11:36am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/16 "2018-11-21T11:36:46Z")

</div>

Io parlo adesso senza aver avuto occasione di controllare la documentazione  
Però credo che il compilatore se ottimizzasse, in particolare il programma del pst 11 sbaglierebbe alla grande  
Quelle variabili sono extern, per il compilatore potrebbero essere usate in file sorgente non ancora compilati, o peggio in oggetti pre-compilati, e il linker ha (avrebbe) bisogno di trovare una variabile del tipo corretto  
Che poi lo IDE di Arduino non ne faccia uso è parrocchia differente.....

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/system/32/1140315_2.png) [@system](https://forum.arduino.cc/u/system)\
**Post date:** [May 7, 2021, 2:15am UTC](https://forum.arduino.cc/t/risolto-dubbio-funzione-for/557750/17 "2021-05-07T02:15:30Z")

</div>


