Perché assegnare le catene per cancellare le variabili?

2

Perché alcuni sviluppatori in C per esempio concatenano assegnazioni di variabili come questa:

i = j = k = 0;

o talvolta formattato come

i =
j =
k = 0;

C'è qualche ottimizzazione sottostante del compilatore qui? I registri hardware si sovrappongono alla prossima variabile caricata o qualcosa del genere? O è questo zucchero sintattico?

    
posta visc 13.03.2018 - 18:47
fonte

4 risposte

5

Non farebbe alcuna differenza nel codice generato per qualsiasi compilatore scritto con competenza.

Almeno quando l'ho fatto, l'ho fatto perché sembrava un'attività relativamente minore, e non volevo che distrasse dal resto del codice.

Alcuni pensano che un po 'di curiosità sia interessante. In PL / I puoi anche scrivere un codice come:

A = B = 0;

Alcuni potrebbero trovare il risultato di questo un po 'sorprendente però. PL / I non ha richiesto l'uso di (per esempio) = per l'assegnazione e == per il confronto. Invece, in un certo senso ... ha indovinato cosa intendevi per un uso particolare di = . Quindi, se avevi qualcosa come if a = b , lo considerava come un confronto, ma se avevi a = b; lo trattava come un compito.

Nel caso di A = B = 0; le cose sono solo un po 'strane: ha trattato il primo = come un compito, ma il secondo come confronto. Quindi, confronta B a 0 e (come C) produce 0 per falso e 1 per vero. Quindi assegnerebbe quel numero intero che rappresenta Booleano ad A. Come risultato, dopo aver eseguito A = B = 0; potremmo essere certi di una cosa: A sarebbe non uguale a B. Se B fosse 0, allora A sarebbe 1 e se B non fosse uguale a 0, allora A sarebbe uguale a 0.

Potresti comunque ignorare la sua ipotesi, quindi A := B := 0; ha assegnato 0 a entrambi A e B.

    
risposta data 13.03.2018 - 18:54
fonte
5

Una delle motivazioni della scrittura

i = j = k = 0;

per me è, è più conveniente nel caso in cui potrebbe essere necessario modificare frequentemente il valore di assegnazione di tutte le variabili (ad es. per test):

i = j = k = 1;
    
risposta data 14.03.2018 - 03:54
fonte
3

In ogni lingua che conosco, non c'è differenza tra i = j = k = 0; e i = 0; j = 0; k = 0; , quindi vince il codice più breve:

  • Digiti meno codice.
  • Richiede meno spazio.

Sembra anche più leggibile. Sarei tentato di leggere:

i = j = k = 0;

as: "Assegna un valore zero alle variabili i, j e k," while:

i = 0; j = 0; k = 0;

sarebbe piuttosto: "Assegna un valore zero alla variabile i, quindi assegna un valore zero alla variabile j, quindi assegna un valore zero alla variabile k."

Come già notato nei commenti, non ho mai visto il secondo stile, e sembra strano. Se vedo questo, probabilmente lo refactoring nella prima forma.

    
risposta data 13.03.2018 - 19:41
fonte
1

Il vantaggio principale è la leggibilità da parte degli esseri umani. Come regola generale, a meno che non si stia lavorando su un codice che deve scalare in maniera massiccia, di solito vale la pena di scambiare inefficienze minori di esecuzione per codice più semplice, leggibile, manutenibile o riutilizzabile. Generalmente il tempo del processore è più economico del tempo del programmatore. Nell'esempio dell'assegnazione della catena non ci sono differenze di efficienza, ma anche se ci fosse stato probabilmente avrei ancora usato l'assegnazione della catena.

Mettere tutto in una riga lo rende più visivamente gestibile e può suggerire ai futuri programmatori che le variabili sono correlate l'una con l'altra.

A livello di immagine grande, vuoi che qualcuno apra il tuo codice e sia in grado di dire: "Ci sono tre cicli che vengono eseguiti in questa routine e alla fine abbiamo questa attività completata". Qualunque cosa tu possa fare per consentire a un futuro programmatore di guardare il tuo codice e arrivare più velocemente è qualcosa su cui dovresti lavorare.

    
risposta data 15.03.2018 - 06:10
fonte

Leggi altre domande sui tag