C Language Operatori di assegnazione

Esempio

Assegna il valore dell'operando di destra alla posizione di memoria indicata dall'operando di sinistra e restituisce il valore.

int x = 5;      /* Variable x holds the value 5. Returns 5. */ 
char y = 'c';   /* Variable y holds the value 99. Returns 99 
                 * (as the character 'c' is represented in the ASCII table with 99).
                 */
float z = 1.5;  /* variable z holds the value 1.5. Returns 1.5. */
char const* s = "foo"; /* Variable s holds the address of the first character of the string 'foo'. */

Diverse operazioni aritmetiche hanno un operatore di assegnazione composto .

a += b  /* equal to: a = a + b */
a -= b  /* equal to: a = a - b */
a *= b  /* equal to: a = a * b */
a /= b  /* equal to: a = a / b */
a %= b  /* equal to: a = a % b */
a &= b  /* equal to: a = a & b */
a |= b  /* equal to: a = a | b */
a ^= b  /* equal to: a = a ^ b */
a <<= b /* equal to: a = a << b */
a >>= b /* equal to: a = a >> b */

Una caratteristica importante di questi compiti composti è che l'espressione sul lato sinistro ( a ) viene valutata solo una volta. Ad esempio se p è un puntatore

*p += 27;

dereferenze p una sola volta, mentre il seguente lo fa due volte.

*p = *p + 27;

Va anche notato che il risultato di un compito come a = b è ciò che è noto come un valore . Pertanto, l'assegnazione ha effettivamente un valore che può quindi essere assegnato a un'altra variabile. Ciò consente il concatenamento di assegnazioni per impostare più variabili in una singola istruzione.

Questo valore può essere utilizzato nelle espressioni di controllo delle istruzioni if (o cicli o istruzioni switch ) che proteggono il codice sul risultato di un'altra espressione o chiamata di funzione. Per esempio:

char *buffer;
if ((buffer = malloc(1024)) != NULL)
{
    /* do something with buffer */
    free(buffer);
}
else
{
    /* report allocation failure */
}

Per questo motivo, è necessario prestare attenzione per evitare un errore di battitura comune che può portare a bug misteriosi.

int a = 2;
/* ... */
if (a = 1)
    /* Delete all files on my hard drive */

Ciò avrà risultati disastrosi, poiché a = 1 valuterà sempre 1 e quindi l'espressione di controllo dell'istruzione if sarà sempre vera (leggi di più su questo errore comune qui ). L'autore quasi certamente intendeva usare l'operatore di uguaglianza ( == ) come mostrato di seguito:

int a = 2;
/* ... */
if (a == 1)
    /* Delete all files on my hard drive */

Associatività dell'operatore

int a, b = 1, c = 2;
a = b = c;

Questo assegna c a b , che restituisce b , che è assegnato a a . Ciò accade perché tutti gli operatori di assegnazione hanno una associatività corretta, vale a dire che l'operazione più a destra nell'espressione viene valutata per prima e procede da destra a sinistra.