Qual è il migliore: a = b o a b + 1 [chiuso]

2

I loop sono solitamente inclusice, esclusivi, il che significa che inizi in basso e si ferma quando raggiungi, ma non in alto. In Python:

for i in range(0,a):
    print(i)

stamperebbe da 0 a a-1. Lo stesso vale per Java:

for(int i = 0; i < a; i++){
    System.out.println(i);
}

dovrebbe anche stampare da 0 a a 1, sebbene la sintassi sia in qualche modo più chiara.

Che cosa succede se si desidera stampare ogni numero fino a un, compreso? Scriveresti

for(int i = 0; i <= a; i++){
    System.out.println(i);
}

o

for(int i = 0; i < a + 1; i++){
    System.out.println(i);
}

Suppongo che il primo abbia più senso, tu stai facendo il ciclo mentre io sono meno o uguale a a, ma il segno meno di quello potrebbe essere facilmente trascurato. La percentuale dia + 1 non è così facile da mancare, secondo me.

Quindi la mia domanda è: c'è un'alternativa migliore dei due, e c'è una convinzione per questa cosa?

EDIT:
Voglio solo far notare che sto parlando di numeri interi qui.

    
posta MartinHaTh 17.09.2013 - 23:11
fonte

3 risposte

11

Di 'cosa intendi.

Se intendi che il ciclo deve essere eseguito mentre la variabile index è minore o uguale a a , dillo.

the less than sign could easily be overlooked

L'operatore <= è molto comune, in particolare nei loop. Fidati del tuo pubblico per essere in grado di leggere correttamente il codice scritto correttamente. Non evitare la soluzione naturale semplicemente a causa di una presunta possibilità che qualche futuro lettore sconosciuto potrebbe aver bisogno di farsi controllare gli occhi.

The a + 1 isn't that easy to miss

Non è così facile da capire, neanche. Cosa penseresti se vedessi il codice che stai proponendo? Sono abbastanza sicuro che penserei qualcosa del tipo:

Perché parliamo di a + 1 quando ovviamente il ciclo dovrebbe arrivare a a ? Oh, aspetta ... Sto guardando il codice, e questo ragazzo sembra avere una fobia su <= ... Non appare da nessuna parte nel codice, e vedo alcuni posti dove esce il suo modo di evitarlo ...

For loops are usually inclusice, exclusive

Questa supposizione non è corretta. Per i loop continuate mentre la condizione di loop è vera.

L'esempio Python che date è "inclusive, exclusive" solo perché range(0,a) di Python capita di generare la lista 0..a-1 . L'intera idea "inclusiva, esclusiva" è un'aringa rossa - si applica solo perché range() funziona in questo modo.

Potresti scrivere facilmente la tua funzione di intervallo che ha restituito 0..a incluso e usarla per controllare il tuo loop. Oppure potresti fornire la tua lista invece di affidarti a range() per generare la lista:

list = [1, 2, 3]
for i in list
   ...

In questo caso il ciclo verrà eseguito tre volte, una volta per ogni valore in list . In altre parole, non è il ciclo for che esclude a nell'esempio, ma piuttosto range() .

    
risposta data 17.09.2013 - 23:58
fonte
23

La migliore convenzione è leggibilità : scrivi il codice il più vicino possibile al tuo intento.

Se intendi: i dovrebbe essere minore o uguale a a , quindi scrivi i <= a .

Se intendi: i dovrebbe essere inferiore a a + 1 , quindi scrivi i < a+1 .

    
risposta data 17.09.2013 - 23:25
fonte
5

Meno o uguale è 1 istruzione assemblatore.

a <= b

Sulla famiglia di processori X86 sopra sarebbe qualcosa di simile a:

MOV EAX, _a_
CMP EAX, _b_
JLE _label_

Meno o b più 1 è due istruzioni di assemblatore extra .

a < b+1

Considerando che quanto sopra sarebbe qualcosa di simile:

MOV ECX, _a_
MOV EDX, _b_
ADD EDX, 1
CMP ECX, EDX
JL _label_

Affermare che un metodo è più leggibile di un altro è semplicemente sciocco. Sono entrambi ugualmente leggibili, ma <= dovrebbe essere lo standard. Chiunque faccia b+1 sta aggiungendo inutilmente compiti extra per la lingua da eseguire. Non importa se si tratta di Java, C #, C ++ o PHP perché stai dicendo di eseguire un'aggiunta non necessaria. Se sei fortunato, il compilatore che stai utilizzando ottimizzerà questo aspetto.

Qualcuno ha risposto:

If you mean: i should be less than or equal to a, then write i <= a.

If you mean: i should be less than a+1, then write i < a+1.

Questo non ha alcun senso, perché i due significano esattamente la stessa cosa. La risposta corretta è minore o uguale . L'espressione matematica più facile da leggere è sempre il i <= a più semplice.

    
risposta data 18.09.2013 - 01:00
fonte

Leggi altre domande sui tag