Ce face and, or, not și ceilalți operatori alternativi
C++ are 11 „simboluri alternative”: cuvinte care înseamnă exact același lucru ca un operator. and = &&, or = ||, not = !, not_eq = != (operatori logici și comparație) și bitand = &, bitor = |, xor = ^, compl = ~, and_eq = &=, or_eq = |=, xor_eq = ^= (operatori pe biți).
Au apărut pentru tastaturile și codificările vechi care nu aveau caracterele &, |, ^, ~. Astăzi unii programatori preferă and, or, not pentru lizibilitate, mai ales not, care se vede mai ușor decât !.
Sunt înlocuite la nivel de simbol, nu de sens: bitand înseamnă & în orice poziție, chiar și într-o declarație de referință (int bitand r = x; este valid, dar de evitat). În C, aceleași nume există doar ca macro-uri în <iso646.h>; în C++ sunt cuvinte cheie. Visual C++ le acceptă doar cu opțiunea /permissive-.
Exemple
Exemplul 1: and, or, not, not_eq în condiții
#include <print>
bool poate_inchiria(int varsta, bool are_permis, int puncte_penalizare) {
return varsta >= 21 and are_permis and not (puncte_penalizare > 10);
}
int main() {
std::println("Ana (25, permis, 2 puncte): {}", poate_inchiria(25, true, 2));
std::println("Dan (19, permis, 0 puncte): {}", poate_inchiria(19, true, 0));
int zi = 6;
bool weekend = zi == 6 or zi == 7;
std::println("Weekend: {}, zi lucrătoare: {}", weekend, zi not_eq 6 and zi not_eq 7);
}
Rezultat
Ana (25, permis, 2 puncte): true
Dan (19, permis, 0 puncte): false
Weekend: true, zi lucrătoare: false
Exemplul 2: Operatori pe biți: bitand, bitor, xor, compl
Permisiunile sunt biți: citire = 4 (100), scriere = 2 (010), execuție = 1 (001). Formatul {:03b} afișează în binar, pe 3 cifre.
#include <print>
int main() {
unsigned citire = 4, scriere = 2, executie = 1;
unsigned drepturi = citire bitor scriere;
std::println("drepturi = {:03b}", drepturi);
std::println("poate scrie: {}", (drepturi bitand scriere) != 0);
std::println("poate executa: {}", (drepturi bitand executie) != 0);
std::println("xor cu toate: {:03b}", drepturi xor 7u);
std::println("compl (ultimii 3 biți): {:03b}", compl drepturi bitand 7u);
}
Rezultat
drepturi = 110
poate scrie: true
poate executa: false
xor cu toate: 001
compl (ultimii 3 biți): 001
Exemplul 3: Atribuiri compuse: and_eq, or_eq, xor_eq
#include <print>
int main() {
unsigned stare = 0b0000;
stare or_eq 0b0101; // stare |= 0b0101
std::println("după or_eq: {:04b}", stare);
stare and_eq 0b0100; // stare &= 0b0100
std::println("după and_eq: {:04b}", stare);
stare xor_eq 0b1111; // stare ^= 0b1111
std::println("după xor_eq: {:04b}", stare);
}
Rezultat
după or_eq: 0101
după and_eq: 0100
după xor_eq: 1011
Greșeli frecvente
- Crezi că
andeste diferit de&&(de exemplu că nu se oprește după primul operand fals). Sunt identice, inclusiv evaluarea scurtă. - Confunzi
bitand(&, pe biți) cuand(&&, logic):2 bitand 1este 0 (fals), dar2 and 1estetrue. - Folosești
xorca ridicare la putere:2 xor 3(sau2 ^ 3) este 1, nu 8. Pentru putere foloseștestd::pow.
Comenzi înrudite
bool, true, false: Tipul logic: o variabilă bool are doar două valori, true (adevărat) sau false (fals).if, else: Execută un bloc de cod doar dacă o condiție este adevărată; else oferă varianta pentru cazul contrar.signed, unsigned, short, long: Modificatori care schimbă mărimea (short, long) sau semnul (signed, unsigned) tipurilor întregi.