Tipikus C++ Baklövések & Kivédésük
Ezek azok a hibák, amelyek a leggyakrabban pontvesztést okoznak a Neumann János Egyetem zárthelyi dolgozataiban. Így ismerd fel és küszöböld ki őket azonnal!
1. Nullával való osztás (Division by zero / SIGFPE)
C++-ban ha egész számot nullával osztunk vagy nullával képzünk maradékot (%), a program azonnal összeomlik futási hibával (SIGFPE / Arithmetic Exception).
// ❌ Hibás:
int a = 10, b = 0;
int maradek = a % b; // CRASH! Összeomlik a program!
// ✔ Helyes (osszetett_feltetel.cpp alapján):
if (b == 0) {
cout << "Hiba: osztas nullaval!" << endl;
} else if (a % b == 0) {
cout << "Oszthato!" << endl;
} 2. Értékadás (=) az Összehasonlítás (==) helyett
A C++ szintaxis megengedi, hogy az if feltételében egyenlőség helyett értékadást írj. Ez szintaktikailag érvényes, de szörnyű logikai hibát okoz, mert az értékadás eredménye igaznak minősül, ha nem nulla!
// ❌ Veszélyes hiba:
int jegy = 3;
if (jegy = 5) { // Értéket ad (jegy most 5 lesz) és IGAZ-ként fut le!
cout << "Kivalo diak!" << endl;
}
// ✔ Helyes:
if (jegy == 5) {
cout << "Kivalo diak!" << endl;
} 3. Túlindexelés tömböknél (Array Index Out of Bounds)
A C++ alapszintű tömbjei (pl. int tomb[10]) nem ellenőrzik a határokat futási időben. Ha a 10 elemű tömb 10. indexére írsz (csak 0-9 érvényes), memóriaszemetet kapsz vagy elszáll a program.
// ❌ Hibás:
int tomb[5];
for (int i = 0; i <= 5; i++) { // HIBA: i = 5 túllépi a tömböt!
tomb[i] = i * 2;
}
// ✔ Helyes:
for (int i = 0; i < 5; i++) {
tomb[i] = i * 2;
} 4. switch-case 'break;' elfelejtése (Fallthrough)
Ha egy case ág végéről elhagyod a break; utasítást, a vezérlés továbbcsorog a következő case ágba is, még akkor is, ha annak a feltétele nem teljesülne.
// ❌ Hibás:
switch (valasztas) {
case 1:
cout << "Elso opcio" << endl; // HIBA: nincs break!
case 2:
cout << "Masodik opcio" << endl; // Ez is le fog futni!
break;
}
// ✔ Helyes:
switch (valasztas) {
case 1:
cout << "Elso opcio" << endl;
break; // Megállítja a továbbcsorgást
case 2:
cout << "Masodik opcio" << endl;
break;
} 5. Karakter és Szám típusok tévesztése cin / cout esetén
Amikor a felhasználótól betűt kérünk be, de int változóba olvassuk, vagy fordítva, a cin folyam hibás állapotba (failbit) kerül, és az összes további beolvasás meghiúsul.
// ❌ Hibás használat:
char c = '5';
int szam = int(c); // Vigyázat: ez NEM az 5 szám lesz, hanem az 53 (ASCII kód)!
// ✔ Helyes számérték kinyerés karakterből:
int valodi_szam = c - '0'; // 53 - 48 = 5 6. Egészosztás miatti tizedesjegy-vesztés
Ha két int típusú számot osztasz el egymással (pl. 5 / 2), a C++ egészosztást végez, és az eredmény 2 lesz a 2.5 helyett.
// ❌ Hibás:
int a = 5, b = 2;
float atlag = a / b; // Az eredmény 2.0 lesz, nem 2.5!
// ✔ Helyes:
float atlag = (float)a / b; // 2.5