Associatività in C

-2
 int i = 2*5/2;
 int j = 2*(5/2);
 printf("%d\n,%d\n",i,j);

Associabilità variabile : quando eseguo questo programma, la prima istruzione mi dà i = 4; Non dovrebbe darmi 2, perché secondo la regola BODMAS / viene valutata prima di * , quindi la variabile avrebbe dovuto essere valutata come (5/2)=2 e poi 2*2=4 ?

So che questa è una domanda noob, ma questo non riesce mai a sorprendermi.

    
posta potato man 07.08.2012 - 16:22
fonte

3 risposte

6

La regola BODMAS è fuorviante. D (ivision) ha uguale rank con M (moltiplicazione). Quindi, poiché hanno un'associatività uguale, passano da sinistra a destra.

Quindi 2 * 5/2 == 10/2 == 5.

Anche A (ddition) e S (ubtraction) hanno lo stesso rango, quindi la regola dovrebbe apparire come (B) (O) (DM) (AS). Ma questo è meno mnemonico.

    
risposta data 07.08.2012 - 16:45
fonte
4

In C, la moltiplicazione e la divisione hanno la precedenza equivalente. Precedenza dell'operatore

i nel tuo esempio dovrebbe restituire 5 poiché le operazioni saranno
2 * 5 = 10
10/2 = 5

Considera una lezione molto importante usare le parentesi ogni volta che l'ordine di valutazione è fondamentale.

Affidarsi al troncamento implicito del valore intero può (ma probabilmente non lo farà) avere un comportamento specifico del compilatore a seconda che lo standard C99 sia stato implementato. Kevin Cline ha pubblicato un SO link che viene ulteriormente approfondito dettagli.
Alcune persone (come me) evitano di affidarsi a funzionalità che possono cambiare con il compilatore. Altri hanno più familiarità con i compilatori che stanno utilizzando e si affidano in modo sicuro a quel tipo di funzionalità. YMMV.

    
risposta data 07.08.2012 - 16:45
fonte
1

Metti sempre () attorno a qualsiasi espressione, anche se "dovrebbe funzionare". Crea un codice più manutenibile e stabile. Lo stesso con {}.

    
risposta data 07.08.2012 - 17:20
fonte

Leggi altre domande sui tag