De ce contează?
Când rezolvi 2 + 3 × 4 la matematică, nu calculezi de la stânga la dreapta ca un robot — știi că înmulțirea se face prima, deci răspunsul e 14, nu 20. Calculatorul respectă exact aceleași reguli pe care le-ai învățat la școală. O expresie aritmetică în C++ nu e altceva decât un calcul matematic scris cu tastatura.
Intuiția
O expresie aritmetică este o rețetă de calcul: iei niște numere, le legi cu operatori și obții un singur rezultat. Operatorii sunt cei pe care îi cunoști — plus și minus — plus încă trei care apar des în programare: înmulțirea, împărțirea și restul. Partea importantă nu e că poți aduna două numere, ci în ce ordine se fac operațiile când sunt mai multe la rând.
Ce este
În C++ ai cinci operatori aritmetici de bază:
| Operator | Ce face | Exemplu | Rezultat |
|---|---|---|---|
+ | adunare | 7 + 2 | 9 |
- | scădere | 7 - 2 | 5 |
* | înmulțire | 7 * 2 | 14 |
/ | împărțire | 7 / 2 | 3 |
% | restul împărțirii | 7 % 2 | 1 |
Când într-o expresie apar mai mulți operatori, calculatorul nu merge orbește de la stânga la dreapta. El respectă prioritatea operatorilor, exact ca la matematică:
- mai întâi
*,/și%(au prioritate mare); - apoi
+și-(au prioritate mică); - la prioritate egală, se merge de la stânga la dreapta.
Iar dacă vrei tu altă ordine, pui paranteze — ele se calculează mereu primele, indiferent de operatorii dinăuntru.
2 + 3 * 4 și (2 + 3) * 4 arată aproape la fel, dar dau rezultate diferite: 14 și 20. Singura diferență sunt parantezele, care răstoarnă ordinea. Parantezele nu sunt decor — ele schimbă răspunsul.
Cum arată
Hai să evaluăm 2 + 3 * 4 pas cu pas, la fel cum face calculatorul. La fiecare pas găsim operația cu prioritatea cea mai mare rămasă, o calculăm, și o înlocuim cu rezultatul ei.
| Pas | Expresia rămasă | Ce calculăm acum | De ce |
|---|---|---|---|
| 1 | 2 + 3 * 4 | 3 * 4 = 12 | * are prioritate mai mare ca + |
| 2 | 2 + 12 | 2 + 12 = 14 | a rămas doar adunarea |
| — | 14 | rezultat final | — |
Observă: deși 2 + 3 apare primul când citești de la stânga, NU se calculează primul. Înmulțirea trece în față.
Acum aceeași expresie, dar cu paranteze — (2 + 3) * 4:
| Pas | Expresia rămasă | Ce calculăm acum | De ce |
|---|---|---|---|
| 1 | (2 + 3) * 4 | 2 + 3 = 5 | parantezele se calculează primele |
| 2 | 5 * 4 | 5 * 4 = 20 | a rămas doar înmulțirea |
| — | 20 | rezultat final | — |
Aceleași numere, aceiași operatori — dar parantezele au schimbat ordinea, deci și rezultatul: 20 în loc de 14.
Truc mental: când vrei să verifici o expresie, încercuiește în minte toate *, /, % și calculează-le întâi; abia apoi te ocupi de + și -. E exact ce face calculatorul, doar că el nu greșește niciodată ordinea.
Împărțirea: întreagă vs zecimală
Aici stă o capcană pe care chiar și olimpicii o ratează. / se comportă diferit în funcție de tipul numerelor:
- dacă ambele numere sunt întregi,
/face împărțire întreagă — păstrează doar câtul și aruncă restul. Deci5 / 2dă2, nu2.5; - dacă măcar unul e număr real (
double),/face împărțire zecimală:5.0 / 2dă2.5.
Iar % îți dă tocmai restul aruncat: 5 % 2 = 1, fiindcă 5 = 2 * 2 + 1.
Implementare C++
Programul de mai jos calculează ambele expresii și arată și diferența dintre cele două feluri de împărțire. Rezultatele sunt notate în comentarii.
#include <iostream>
using namespace std;
int main() {
// fara paranteze: inmultirea se face prima
int a = 2 + 3 * 4; // 3*4=12, apoi 2+12 -> a = 14
// cu paranteze: adunarea se face prima
int b = (2 + 3) * 4; // 2+3=5, apoi 5*4 -> b = 20
// impartire intreaga: doar catul
int impartireIntreaga = 5 / 2; // 2 (restul 1 se arunca)
int rest = 5 % 2; // 1 (restul impartirii)
// impartire zecimala: macar un numar real
double impartireReala = 5.0 / 2; // 2.5
cout << a << endl; // 14
cout << b << endl; // 20
cout << impartireIntreaga << endl; // 2
cout << rest << endl; // 1
cout << impartireReala << endl; // 2.5
return 0;
}Două capcane care îți strică rezultatul fără niciun mesaj de eroare:
-
Te bazezi pe ordinea de la stânga la dreapta și uiți prioritatea. Scrii
2 + 3 * 4așteptând20, dar calculatorul face întâi înmulțirea și obține14. Dacă vrei chiar20, pune paranteze:(2 + 3) * 4. -
Folosești împărțirea întreagă fără să-ți dai seama.
5 / 2dă2, nu2.5, fiindcă ambele numere sunt întregi — restul e aruncat în tăcere. Dacă vrei2.5, măcar un operand trebuie să fie real: scrie5.0 / 2și pune rezultatul într-undouble.