È buona pratica eliminare zero in una dichiarazione se possibile (ad esempio :rewrite a-b0 in ab)?

2

A volte, scriverei if-statement con condizioni del genere:

if(a-b>0){
}

ma in realtà, posso spostare "b" da sinistra a destra:

if(a>b){
}

Casi simili come 'a-b! = 0', 'a-b < = 0' (non è il caso di 'a > 0') possono anche applicarlo. La mia motivazione per farlo è:

  1. hanno una dichiarazione più breve

  2. evita il numero magico '0'

È una buona pratica come abitudine di codifica?

    
posta mmmaaa 11.05.2018 - 05:27
fonte

3 risposte

17

Semanticamente, i tuoi due esempi significano due cose diverse. Il tuo primo esempio controlla se il risultato di una sottrazione è un numero positivo. Il tuo secondo esempio controlla se un numero è maggiore dell'altro.

Sebbene siano matematicamente equivalenti, non sono equivalenti semanticamente. La tua scelta dovrebbe essere quella che meglio rappresenta la semantica del tuo programma. In altre parole, qualunque sia più leggibile nel tuo contesto specifico.

    
risposta data 11.05.2018 - 05:57
fonte
7

Dipende molto (sulla semantica di - e di > ).

Innanzitutto, non hai menzionato il tipo di a e di b . Ma supponiamo per semplicità che abbiano entrambi lo stesso tipo integrale (ad esempio C int o long ).

Quindi, a - b potrebbe essere errato (si pensi a casi strani come overflow) o comportamento indefinito (si pensi all'aritmetica del puntatore, in alcuni casi la differenza di calcolo tra puntatori non collegati è UB). E in alcuni linguaggi di programmazione e con alcuni tipi, è possibile definire a-b e confrontare con 0, ma a>b potrebbe non essere. A volte in C ++ a-b , a>b , x>0 sarebbero tre diversi operatori definiti dall'utente di alcuni utenti specificati class (immagina alcuni bignum library) con diversi comportamenti e prestazioni.

Anche a e b potrebbero avere alcuni tipi bizzarri (forse matrici ...) e confrontarli potrebbe avere senso quando il calcolo delle loro differenze è inaffidabile, o richiede tempo, ecc.

Leggi la regola as-if e le specifiche precise del tuo particolare linguaggio di programmazione (e la sua semantica ).

Infine, in molti casi a - b > 0 è più leggibile di a > b (ad esempio quando a e b sono istanti temporali, la loro differenza è una durata). Quindi dipende davvero.

Sostituendo a-b>0 con a>b (o viceversa, se utile) -per interi- è una micro-ottimizzazione che la maggior parte di ottimizzare i compilatori farebbe meglio di te. Quindi non preoccuparti!

Is it a good practice as a coding habit?

Non nel 2018 , a meno che non migliori la leggibilità. Devi prestare molta attenzione a per rendere il tuo codice leggibile .

BTW, IMHO 0 di solito non è un numero magico . È piuttosto speciale (in alcuni rari casi potrebbe essere un numero magico, ma scegliere 0 come magia è di cattivo gusto e incline agli errori ...).

    
risposta data 11.05.2018 - 10:03
fonte
1

È semplice: se vuoi sapere se a è maggiore di b, scrivi un > b. Se vuoi sapere se il risultato della sottrazione di b da a è maggiore di 0, scrivi a - b > 0.

Sii consapevole delle sottili differenze. a > b con i tipi integer o floating point ti darà il risultato matematicamente corretto. Quando si calcola a - b, è possibile ottenere un overflow / underflow e un comportamento indefinito con interi con segno. Con interi senza segno, qualsiasi risultato è ≥ 0, quindi il risultato a - b > 0 sarà vero tranne quando a == b. Per i numeri a virgola mobile, infinito meno infinito dà NaN, che non è maggiore di 0, o minore di 0, o uguale a 0, quindi questo può sorprendere.

E per le lingue con controlli di overflow, a - b > 0 può sempre portare a un arresto anomalo.

Ma francamente, non ho mai e poi mai sostituito a - b > 0 con a > b. E questo perché non mi verrebbe mai in mente di scrivere a - b > 0 in primo luogo.

    
risposta data 11.05.2018 - 22:29
fonte

Leggi altre domande sui tag