Expresii

Bază~14 min10 pași

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ă:

OperatorRolExempluRezultat
+ - *adunare, scădere, înmulțire4 * 312
/împărțire7 / 23 (întreagă!)
%restul împărțirii (modulo)17 % 52

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 real
Observația-cheie

Regula: 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 == 0d divide n.
  • Ultima cifră: n % 10 îți dă cifra unităților; n / 10 „taie" acea cifră.

Exemplu pe n = 2024:

OperațieRezultatSens
2024 % 104ultima cifră
2024 / 10202numărul fără ultima cifră
2024 % 20e par

Prioritatea operatorilor

Ordinea în care se aplică operatorii:

  1. Parantezele ( ) — întotdeauna primele.
  2. *, /, % — prioritate medie.
  3. +, - — 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;
}
Observația-cheie

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.

Greșeli frecvente

Capcane reale la expresii:

  • Împărțire întreagă neintenționată: calculezi o medie cu (a + b) / 2 în int ș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 % 3-1, nu 2. La aritmetică modulară corectează cu ((a % m) + m) % m.
  • Overflow în expresie: int s = n * n; pentru n = 100000 se sparge înainte de atribuire. Calculează în long long.

De reținut

  • int / int taie zecimalele; pentru rezultat real, fă un operand double.
  • % dă restul — îl folosești pentru divizibilitate și cifre.
  • Prioritatea e ( ) > * / % > + -; când ai dubii, pune paranteze.

Întrebarea 1 / 3

Cât valorează `7 / 2` în C++ dacă ambele numere sunt întregi?