De ce contează?
Când calculezi în minte „cât dau 3 pixuri a câte 2 lei plus o agendă de 5 lei", faci automat înmulțirea înaintea adunării: 3·2 + 5 = 11. Ai aplicat o regulă de prioritate fără să te gândești. C++ urmează exact aceleași reguli, doar că trebuie să le cunoști explicit.
Ce este o expresie
O expresie combină valori și variabile cu operatori pentru a produce un rezultat. Operatorii aritmetici de bază:
| Operator | Rol | Exemplu | Rezultat |
|---|---|---|---|
+ - * | adunare, scădere, înmulțire | 4 * 3 | 12 |
/ | împărțire | 7 / 2 | 3 (întreagă!) |
% | restul împărțirii (modulo) | 17 % 5 | 2 |
Capcana împărțirii întregi
Asta surprinde pe oricine la început: dacă ambii operanzi sunt întregi, / taie
partea zecimală — nu rotunjește, o aruncă.
int a = 7, b = 2;
cout << a / b; // 3, nu 3.5
cout << 7.0 / 2; // 3.5, fiindca 7.0 e realRegula: rezultatul are tipul „cel mai bogat" dintre operanzi. int / int = int. Ca să
obții zecimale, măcar unul trebuie să fie double (scrie 7.0 sau folosește o variabilă double).
Modulo — restul care spune multe
a % b dă restul împărțirii lui a la b. Două folosiri pe care le vei întâlni constant:
- Divizibilitate:
n % d == 0⟺ddividen. - Ultima cifră:
n % 10îți dă cifra unităților;n / 10„taie" acea cifră.
Exemplu pe n = 2024:
| Operație | Rezultat | Sens |
|---|---|---|
2024 % 10 | 4 | ultima cifră |
2024 / 10 | 202 | numărul fără ultima cifră |
2024 % 2 | 0 | e par |
Prioritatea operatorilor
Ordinea în care se aplică operatorii:
- Parantezele
( )— întotdeauna primele. *,/,%— prioritate medie.+,-— prioritate mică.
La prioritate egală, se merge de la stânga la dreapta.
#include <iostream>
using namespace std;
int main() {
int rezultat = 2 + 3 * 4; // 14: intai 3*4, apoi +2
int fortat = (2 + 3) * 4; // 20: parantezele schimba ordinea
int medie = (8 + 6) / 2; // 7: paranteze obligatorii aici
cout << rezultat << " " << fortat << " " << medie << "\n";
return 0;
}Fără parantezele de la medie, 8 + 6 / 2 ar însemna 8 + 3 = 11, nu media. Când ai
dubii, pune paranteze: nu costă nimic și fac codul corect și lizibil.
Operatori de atribuire pe scurt
s += a[i] e prescurtarea lui s = s + a[i]. Similar -=, *=, /=, %=. Iar
i++ crește i cu 1. Le vei folosi des în bucle.
Complexitate
O expresie aritmetică se evaluează în O(1) — cost constant. Atenție însă: o expresie
poate ascunde overflow. a * b cu a, b mari se sparge în int chiar dacă o atribui
unui long long.
Capcane reale la expresii:
- Împărțire întreagă neintenționată: calculezi o medie cu
(a + b) / 2înintși pierzi zecimalele când conta precizia. - Prioritate greșită:
a + b % cînseamnăa + (b % c), nu(a + b) % c. Pune paranteze. %cu numere negative: în C++-7 % 3dă-1, nu2. La aritmetică modulară corectează cu((a % m) + m) % m.- Overflow în expresie:
int s = n * n;pentrun = 100000se sparge înainte de atribuire. Calculează înlong long.
De reținut
int / inttaie zecimalele; pentru rezultat real, fă un operanddouble.%dă restul — îl folosești pentru divizibilitate și cifre.- Prioritatea e
( )>* / %>+ -; când ai dubii, pune paranteze.