Gotcha

Disambiguazione – Se stai cercando altri significati, vedi Gotcha (disambigua).

Nella programmazione, un gotcha è una caratteristica di un programma o un linguaggio di programmazione, che lavora in un modo che è corretto dal punto di vista formale – cioè rispetta la sintassi del linguaggio – ma che non è quello che ci si aspetta dal programma, nelle intenzioni del programmatore. Ciò induce all'errore perché tale comportamento è sia facile da riprodurre che completamente inaspettato.

Il termine è una storpiatura della pronuncia dell'espressione inglese I got you, che in questo contesto si potrebbe tradurre con "Ti ho beccato". In questo senso, una resa in italiano accettabile potrebbe essere "trabocchetto".

Gotcha in linguaggio C

[modifica | modifica wikitesto]

Operatore di assegnamento

[modifica | modifica wikitesto]

Ad esempio in un programma C, quando scriviamo l'istruzione:

if(a = b)     printf("Hello World\n"); 

il programma stamperà a video la stringa "Hello World" solo se b è diverso da false, in quanto il programma assegna ad a il valore di b e poi valuta a. Infatti in C, come in molti altri linguaggi, l'operatore di assegnamento (=) è distinto da quello di confronto (==).

Probabilmente il programmatore intendeva scrivere:

if(a == b)     printf("Hello World\n"); 

che invece valuta se il valore a è uguale a quello del valore b, e in caso positivo stampa la stringa "Hello World".

Questo è appunto il caso di un "gotcha".

Chiamata a funzione

[modifica | modifica wikitesto]

Un altro esempio

/* File name: fortytwo.c */ #include <stdio.h>  foo() {    printf("  42!\n"); }  int main() {     printf("Qui sotto scriverò '42':\n");     foo;     printf("Penso di aver scritto '42', ma non ne sono sicuro...\n");     return 0; } 

Il programma, dopo essere stato compilato ed eseguito, produrrà in output:

$ ./fortytwo Qui sotto scriverò '42': Penso di aver scritto '42', ma non ne sono sicuro... 

Ciò che l'espressione foo; fa – in modo controintuitivo per chi non conosce a fondo il linguaggio – è quello di restituire l'indirizzo di memoria della funzione foo. Probabilmente il programmatore intendeva effettuare una chiamata a funzione:

    foo(); 

dove le parentesi indicano una chiamata a funzione senza argomenti.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica