Curiosità su assegnazione e postincremento ...

… mi sembrava che in C bastasse scrivere num++ (o l’opposto), senza il resto, per incrementarlo …

... inoltre, adesso che ci faccio caso, se non ricordo male, in C, Num e num sono due variabili diverse, dato che il compilatore dovrebbe distinguere fra minuscole e maiuscole ... giusto ?

Sì, ma la maiuscola è probabilmente inserita dall'autocorrettore di doc, nello sketch originale c'è sempre num, tutto minuscolo.

E questo è appunto undefined behaviour.

Per la terza volta:

num = num++;

in C/C++ è UNDEFINED BEHAVIOUR, ovvero il risultato non è definito. Qualche post fa ho anche linkato una domanda su StackOverflow dove si approfondisce la cosa.

Non c’è nessuna sequenza corretta in quel caso, in quanto ci sono due assegnazioni alla stessa variabile senza un sequence point tra di esse. Questo fa sì che si ricada in un caso in cui lo standard C non specifica quale comportamento è quello corretto.

Già in un altro post tempo fa avevamo parlato di questa cosa, e anche lì nessuno se ne convinceva. Il bello è che lì mi pare ci fosse pure qualcuno che aveva provato a compilare lo stesso codice con due versioni diverse di gcc, ottenendo due comportamenti diversi, e ancora non era convinto di essere in un caso di UB ;). Più tardi cerco il thread.

Se scrivi a=i++ stai facendo due assegnazioni a due variabili diverse, non c'è nessun problema.

Leggi il link su StackOverflow che ho postato, c'è gente ben più autorevole di me che ne parla.

... questo perche' le assegnazioni viaggiano con precedenza da destra a sinistra ?

pero' (ma forse sbaglio), posto I=3, e scrivendo come dici I=A=I++ ... se la precedenza va da sinistra a destra nell'assegnazione, ma da destra a sinistra nel calcolo ...

1) A=I++, quindi A=3 (la prima assegnazione) 2) I++, quindi I=4 (valore di I incrementato dopo averlo usato) 3)pero' poi I=A (quindi I=3 di nuovo)

... un po piu complicata non potevano farla ? ... :P

... ehm ...

... ma poi perche' uno dovrebbe usare una sequenza del genere ? ... si fa mica prima ad evitarle ? ... :D

docsavage: la questione vera è se si tratta di un comportamento definito oppure no

secondo me lo è: definito, dal K&R

Io invece dico che non lo è, ma non ti spiego perché, visto che è già spiegato su SO (sito particolarmente noto per la qualità dei contenuti) da gente che di queste cose ne sa più di tutti noi messi insieme.

Francamente non capisco questa cocciutaggine. Credi che si siano rincitrulliti tutti? È un concetto abbastanza complicato, ma basta leggere là, ci sono esempi e dovizia di spiegazioni.

Poi per me ognuno è libero di credere quel che vuole, intanto se ha un minimo di buon senso si guarda bene dall'infilarsi senza motivo in situazioni inutilmente complesse come questa ;).

Ancora una volta: no.

Ma ci rinuncio.

Credo che ti toccherà aprire un bug a GCC:

sukko@porcupine ~ $ cat ub.c 
#include <stdio.h>

int main (void) {
    int i = 41;

    printf ("1 i = %d\n", i);

    i = i++;

    printf ("2 i = %d\n", i);

    return 0;
}
sukko@porcupine ~ $ gcc -Wall ub.c -o ub
ub.c: In function ‘main’:
ub.c:8:4: warning: operation on ‘i’ may be undefined [-Wsequence-point]
  i = i++;
    ^

E… SORPRESONA (per te)!

sukko@porcupine ~ $ ./ub 
1 i = 41
2 i = 41

Quanto sopra con GCC 5.4.0 su x86_64. Sul RasPi (armv6l), invece, con GCC 4.7.1:

sukko@slackberry ~ $ gcc -Wall ub.c -o ub
ub.c: In function ‘main’:
ub.c:8:4: warning: operation on ‘i’ may be undefined [-Wsequence-point]
sukko@slackberry ~ $ ./ub 
1 i = 41
2 i = 42

++variabile e Variabile++

++variabile viene incrementata prima dell uso variabile ++ viene incrementata dopo l'uso

percui a = i++; significa a =i; i=i+1;

e a=++i; significa i=i+1; a=i;

a[ i ]= i++ significa a[ i ]=i; i=i+1;

i = i++ + ++i; non so cosa fa. a= i++ + ++i; fa i=i+1; //dal ++i a=i+i; i=1+1; //dal i++

non so cosa succede o é ammissible i=i++;

Ciao Uwe

Un automobilista sta ascoltando il giornale radio che viene interrotto per una comunicazione urgente: "Attenzione, attenzione ... a tutti gli automobilisti ... un pazzo ha imboccato l'autostrada del Sole contromano!!!" Appena ascoltato il messaggio, l'uomo esclama schivando le macchine: "Per fortuna che doveva essere solo uno ... qua saranno un centinaio!!"

PS: Va bene lo split gpb, ma perché in Hardware? :)

SukkoPera: PS: Va bene lo split gpb, ma perché in Hardware? :)

Perché questo stupendo motore ... me lo fa fare solo nella stessa sezione. Però effettivamente, ora posso spostare l'intero thread nella sezione Software :D

Provvedo ...

Guglielmo

_Edit: Fatto _ :grin: :grin: :grin: