gcali (Normal User)
Newbie
Messaggi: 12
Iscritto: 23/03/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 |
o ancora questa condizione per un ciclo while che si arresterà quando la variabile avrà valore zero:
Codice sorgente - presumibilmente Plain Text |
Possono essere utili per risparmiare spazio o memoria, o semplicemente un utilizzo "curioso" di una funzionalità del linguaggio. Voi quali conoscete? |
|
nessuno (Normal User)
Guru^2
Messaggi: 6378
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Il mio preferito:
L'operatore freccia!
Codice sorgente - presumibilmente C/C++ |
int i = 5;
while(i --> 0){
printf("%d\n", i);
}
//4, 3, 2, 1, 0
|
|
|
gcali (Normal User)
Newbie
Messaggi: 12
Iscritto: 23/03/2014
|
Funziona, io l'ho sempre usato.
Naturalmente il risparmio è talmente piccolo che non avrebbe quasi senso, ma a me personalmente darebbe fastidio dichiarare una variabile solo per lo swap. 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!
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6378
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
gcali (Normal User)
Newbie
Messaggi: 12
Iscritto: 23/03/2014
|
Postato originariamente da nessuno:
Postato originariamente da gcali:
Funziona
|
No ... mi sembra proprio di no ... Fai un esempio concreto ... |
Codice sorgente - presumibilmente C++ |
#include <stdio.h> int main() { int a = 10, b = 20; printf(" a = %d\n b = %d\n\n", a, b); a = (a + b) - (b = a); printf(" a = %d\n b = %d\n\n", a, b); return 0; }
|
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.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6378
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|