Oppure

Loading
03/05/14 16:12
gcali
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:
a = a + b - (b = a)
o ancora questa condizione per un ciclo while che si arresterà quando la variabile avrà valore zero:
while(a--)
Possono essere utili per risparmiare spazio o memoria, o semplicemente un utilizzo "curioso" di una funzionalità del linguaggio. Voi quali conoscete?
aaa
03/05/14 21:51
nessuno
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 03/05/14 22: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à.
03/05/14 23:08
pierotofy
Il mio preferito:

L'operatore freccia!

int i = 5;
while(i --> 0){
   printf("%d\n", i);
}

//4, 3, 2, 1, 0


:D

Questi sono piu' utili: graphics.stanford.edu/~seander/…
Il mio blog: piero.dev
03/05/14 23:26
gcali
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!
aaa
04/05/14 7:44
nessuno
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à.
04/05/14 11:26
gcali
Postato originariamente da nessuno:

Postato originariamente da gcali:
Funziona


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


#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. :noway:
aaa
04/05/14 11:46
nessuno
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 04/05/14 11: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à.