Web Log di Adrian Florea

"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
posts - 440, comments - 2715, trackbacks - 3944

My Links

Archives

Post Categories

Image Galleries

.RO Blogs

.RO People

.RO Sites

Blogs

Furls

Links

vinCitori

Test di buon rientro (i vincitori con le loro spiegazioni)

Ormai sono passate quasi due settimane da quando vi ho proposto questo test:

"Pensate a dichiarare e inizializzare x e y in modo da avere:

x += y; // un'assegnazione corretta
x = x + y; // errore di compilazione"

e aggiungevo che "apprezzerò nei vostri feedback le spiegazioni migliori". Alla fine, siete ri-entrati tutti (dalle vacanze) ma solo due di voi sono ri-usciti :-) a mandarmi feedback validi.

Il primo è stato lo Schumacher dei miei test, Flavio Polesello:

"Per generare un errore di compilazione sull'assegnazione x = x + y è sufficiente dichiarare le variabili x e y di 1 o di 2 byte (sbyte, short, byte, ushort e char).

Un esempio è il seguente:

public static void Main()
{
  byte x = 0;
  byte y = 0;
  x += y; // un'assegnazione corretta
  x = x + y; // errore di compilazione
}

Il CLR esegue le operazioni aritmetiche solo su 32 bit e 64 bit. Se si devono sommare due variabili di 8 bit o 16 bit (1 o 2 byte), queste  vengono convertite implicitamente a 32 bit, vengono sommate e infine viene restituito un valore ancora a 32 bit. L'errore di compilazione è dato dal fatto che il valore di ritorno deve essere riconvertito esplicitamente.

Nell'esempio di prima, questa assegnazione sarebbe valida:

x = (byte)(x + y);

A differenza dell'operatore +, nell'operatore += la conversione viene  fatta implicitamente e quindi non ci sono errori di compilazione."

Il secondo è stato Marco Poponi. Qui la sua spiegazione:

char x = 'x';
char y = 'y';

//ok: non c'è bisogno di conversione esplicita, visto che x viene aumentato.
x += y;

//errore: c'è bisogno di una conversione esplicita per x + y
x = x + y;

Una volta compilato (con una explicit conversion) quello che fa è lo stesso: prima inizializza con due i4, somma, poi converte in u2, poi riassegna.

Complimenti a tutti e due!

Ah, dimenticavo... mi ha mandato anche Richter la sua spiegazione: la trovate qui, alla pagina 131 :-)

Oggi ho fatto 6 mesi da quando bloggo... Mi è venuto in mente il gigante quaderno rosso in cui bloggavo a casa, sulla carta (!), un sacco di cose di matematica. Ho riempito lì circa 700 pagine in una decina di anni a partire dall'89; si chiamava quel quaderno, proprio così con maiuscole, "N-AM TIMP", cioè "NON HO TEMPO". Mi manca parecchio il suo odore, il suo tocco, peccato che non l'ho portato qui con me.

Print | posted on sabato 4 settembre 2004 02:08 | Filed Under [ Test Sharp ]

Powered by:
Powered By Subtext Powered By ASP.NET