Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Tips and Tricks in C. Quali conosciamo?
Forum - C/C++ - Tips and Tricks in C. Quali conosciamo?

Avatar
gcali (Normal User)
Newbie


Messaggi: 12
Iscritto: 23/03/2014

Segnala al moderatore
Postato alle 18:12
Sabato, 03/05/2014
Conoscete dei trucchi per eseguire un determinato compito in maniera "non convenzionale"?

Ad esempio, per eseguire lo swap fra due variabili senza utilizzarne una terza:
Codice sorgente - presumibilmente Plain Text

  1. a = a + b - (b = a)

o ancora questa condizione per un ciclo while che si arresterà quando la variabile avrà valore zero:
Codice sorgente - presumibilmente Plain Text

  1. while(a--)

Possono essere utili per risparmiare spazio o memoria, o semplicemente un utilizzo "curioso" di una funzionalità del linguaggio. Voi quali conoscete?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:51
Sabato, 03/05/2014
Risparmi poco o nulla ...

Comunque, per scambiare due interi senza variabile temporanea puoi scrivere

x^=y; y^=x; x^=y;

... quello che hai proposto non mi pare funzioni ...

Ultima modifica effettuata da nessuno il 04/05/2014 alle 0:15


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 1:08
Domenica, 04/05/2014
Il mio preferito:

L'operatore freccia!

Codice sorgente - presumibilmente C/C++

  1. int i = 5;
  2. while(i --> 0){
  3.    printf("%d\n", i);
  4. }
  5.  
  6. //4, 3, 2, 1, 0



Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
gcali (Normal User)
Newbie


Messaggi: 12
Iscritto: 23/03/2014

Segnala al moderatore
Postato alle 1:26
Domenica, 04/05/2014
Funziona, io l'ho sempre usato. :yup:

Naturalmente il risparmio è talmente piccolo che non avrebbe quasi senso, ma a me personalmente darebbe fastidio dichiarare una variabile solo per lo swap. :D Di usare lo XOR non mi era mai venuto in mente, grazie mille!

Sul manuale sul quale sto studiando c'è giusto un accenno sulle manipolazioni di bit, quel link mi tornerà utile!

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 9:44
Domenica, 04/05/2014
Testo quotato

Postato originariamente da gcali:
Funziona
  



No ... mi sembra proprio di no ... Fai un esempio concreto ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
gcali (Normal User)
Newbie


Messaggi: 12
Iscritto: 23/03/2014

Segnala al moderatore
Postato alle 13:26
Domenica, 04/05/2014
Testo quotato

Postato originariamente da nessuno:

Testo quotato

Postato originariamente da gcali:
Funziona
  



No ... mi sembra proprio di no ... Fai un esempio concreto ...



Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int a = 10,
  6.        b = 20;
  7.  
  8.    printf(" a = %d\n b = %d\n\n", a, b);
  9.  
  10.    a = (a + b) - (b = a);
  11.  
  12.    printf(" a = %d\n b = %d\n\n", a, b);
  13.  
  14.    return 0;
  15. }



Il programma esegue prima la somma di a e b, poi assegna a b il valore di a e ad a la differenza.
In questo modo funziona sicuramente.

Nel codice postato prima non c'erano le parentesi tonde in a + b, ed effettivamente sarebbe dovuto essere eseguito come:

b = 10
a = 10 + 10 - 10 = 10

Rimane il fatto che, compilando con gcc, il risultato è lo swap delle due variabili. :noway:

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:46
Domenica, 04/05/2014
Ti posso assicurare che con altri compilatori la parte (b=a) viene eseguita prima e quindi salta tutto.

Dipende dalle ottimizzazioni usate dal compilatore e dato che non è affidabile sempre, la eviterei.

Ultima modifica effettuata da nessuno il 04/05/2014 alle 13:52


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote