Kde bolo, tam bolo, bola raz jedna sociálna krajina, kde sa rozhodli odmeniť zbiedených.
Počnúc zajtrajšom, každý, kto nezarába nič, dostane 60 dukátov ako dar od štátu.
Ľud zabedákal, IT divízie sa zaradovali, lebo mohli vyhrať tender na systém pre výpočet dane. Vyhrala firma GCC s.r.o. s nasledovným kódom:
#include <stdio.h>
#include <stdlib.h>
#define SOCIALNA_DAVKA 60;
int ziskaj_mzdu(int mzda) {
if(mzda = 0) {
return SOCIALNA_DAVKA;
} else {
return mzda;
}
}
int main()
{
printf("Prijem pre pracujuceho: %d\n", ziskaj_mzdu(2000));
printf("Prijem pre nepracujuceho: %d\n", ziskaj_mzdu(0));
return EXIT_SUCCESS;
}
Systém zostavili, nasadili… a žiadny bezprijímový občan nedostal nič. Obyvatelia dva týždne revoltovali, zvrhli vladára, na jeho miesto nastúpil nový, ten vyhlásil nový tender na nový informačný systém (v Jave), a všetci žili šťastne až kým nepomreli.
Prečo GCC padla?
Na konštrukcie typu
if(mzda == 0)
si treba dávať veľký pozor. Ak prichádzate z iných jazykov, napríklad Pascalu, stáleho hitu stredných škôl, tak sa pokojne môže stať, že napíšete (beda!):
if(mzda = 0)
V Jave je to samozrejme kompilačná chyba, ale v C to vedie len k varovaniu. Čo sa stane?
- do premennej
mzda
sa priradí nula - celý priraďovací príkaz sa vyhodnotí na hodnotu premennej
mzda
- hodnota premennej
mzda
sa použije ako pravdivostná hodnota doif
u.
Na príklade:
if(mzda = 0)
|||
VVV
V
if(0)
čo znamená, že vnútro if
u sa nevykoná nikdy.
Ešte krajší je príklad
if(mzda = 1)
aleb
if(mzda = 2000)
ktorý sa (podobnou úvahou) vždy vyhodnotí na pravda
˛.
Pokiaľ máte v gcc
zapnuté varovania (buď -Wall
alebo -Wparentheses
), dodstanete takúto chybovú hlášku:
error: suggest parentheses around assignment used as truth value
Ešte ďalšie bedáky nad if
mi
Na hranici zvrhlosti je príklad:
int x = 20;
if(1 <= x <= 10) {
printf("V intervale 1..10.");
}
Varovná hláška:
error: comparisons like 'X<=Y<=Z' do not have their mathematical meaning
Bez nej by sa to vyhodnotilo vždy na nepravda
, keďže operátor <=
je zľava asociatívny, platilo by
(1 <= x) <= 10
1 <= 10
1
Záver
Ako obvykle: zapínajte varovania! Hlavne ak ste začiatočníci!