2013-02-22 57 views
5

C'è qualche differenza traDifferenza tra "o" e "||"

if (a or b or c) { 

... e ...

if (a || b || c) { 

... e più in generale tra i due operatori, anche in termini di precedenza?

+4

No. –

+0

Non c'è alcuna differenza in alcun modo. Sono equivalenti. – juanchopanza

+8

Omg, 10 anni di esperienza in C++ e non sapevo che esistessero ('o', 'e' ecc.) ... –

risposta

6

A parte il senso stilistico che fa pensare a molti programmatori esperti "Huh, qualcuno ha improvvisamente iniziato a scrivere Pascal?", Non c'è alcuna differenza funzionale.

Lo scopo di questi nomi alternativi è consentire alle persone che vivono in, ad esempio, Svezia o Germania, di utilizzare una variante locale standard ASCII, dove | è ö.

Dall'introduzione di Unicode e ASCII esteso, questa esigenza è praticamente scomparsa, poiché i set di caratteri nazionalizzati non devono "rubare" caratteri meno comunemente usati per produrre i loro caratteri "speciali" nazionali.

+0

Tornato all'università, ho visto un ragazzo con una libreria di macro che faceva sembrare il codice C++ quasi esattamente come pascal. Compreso 'begin' e' end'. – Sulthan

+1

Non ho capito il tuo secondo paragrafo - per quanto ne so io ö' non esiste nella tabella ASCII danese e certamente non su una tastiera danese. Su una tastiera danese il carattere pipe '|' si trova nella prima riga a sinistra di '← Backspace' e su' Å' mentre su una tastiera americana il pipe è - come tutti sapete - situato sotto '← Backspace'. – Muleskinner

+0

ASCII è ASCII e non ci sono varianti. Forse intendevi le codepage, ma quelle variano solo nella regione oltre l'ASCII, cioè i valori dei caratteri da 128 a 255. I caratteri '|' e '&' sono in ASCII e quindi in qualsiasi codepage. Ciò che è diverso negli altri paesi è il layout della tastiera, e quando quei caratteri speciali potrebbero essere difficili da accedere, 'o',' e' ecc. –

2

modificato È possibile sovraccaricare operator or.

Sono uguali.

Vedere Operators in C and C++.

Se si esegue il sovraccarico di operator or per un tipo, non è possibile sovraccaricare lo operator|| per lo stesso tipo in cui il compilatore considererà la stessa funzione.

Questo errore deriva dal seguente codice:

> prog.cpp: In function ‘bool operator||(Type, Type)’: 
> prog.cpp:8:6: error: redefinition of ‘bool operator||(Type, Type)’ 
> prog.cpp:4:6: error: ‘bool operator||(Type, Type)’ previously defined here 

Su ideaone:

class Type {} 
}; 

bool operator or(Type lhs, Type rhs) { 
    return true; 
} 

bool operator ||(Type lhs, Type rhs) { 
    return false; 
} 

int main() { 
    Type a; 
    Type b; 
    a or b; 
    a || b; 
} 
+0

Sebbene non sia possibile eseguire il overload di 'or' per indicare una cosa diversa da' || ', è possibile sovraccarico '||' e usare 'or' lo userà anche. – PlasmaHH

+0

È possibile sovraccaricarlo, ma viene quindi chiamato 'operatore o'. – MSalters

1

Come da ISO14882: 2011 (e) 2.6-2 (Tabella 2) or è un token per un'alternativa ||, e come tale ha esattamente lo stesso significato:

In tutti gli aspetti della lingua langua ge, ogni token alternativo si comporta allo stesso come token primario, tranne che per il suo spelling.

Spesso i compilatori li implementano come #define or || o l'equivalente interno.

Lo stesso vale per and, bitor, xor, compl, bitand, and_eq, or_eq, xor_eq, not e not_eq.

1

Come è stato detto nelle altre risposte, i due sono pensati per essere uguali e quindi scambiabili. Ma c'è una grande differenza: MSVC, C++ Builder e forse anche altri compilatori non supportano or senza includere un'intestazione speciale. Questo rende l'uso di or un ostacolo di portabilità.