O jazyku
Jazyk C vymysleli a napísali v 70-tych rokoch 20. storočia zamestnanci Bellových laboratórií. Boli to páni Brian W. Kernighan a Denis M. Ritchie.
Tento jazyk patrí medzi kompilačné jazyky, čo znamená, že najprv musíme zdrojový kód napísať v editore, preložiť do podoby, ktorej rozumie procesor (do strojového kódu) a až následne môžeme program spustiť. Nejedná sa teda o interprečný jazyk, ktorý vykoná preklad jedného riadku nášho zdrojového kódu, ktorý následne vykonáva procesor. Takýto jazyk je napríklad Basic.
Jazyk C je veľmi obľúbený pre svoju rýchlosť oproti interprečným jazykom a pre svoju univerzálnosť. Môžeme ho preložiť pod akýmkoľvek operačným systémom (Linux, Microsoft Windows, FreeBSD), dokonca C bolo navrhnuté a implementované pre Unix a takmer celý Unix bol v ňom napísaný.
Ako začať?
Tento seriál, ako som už spomínal, je písaný pre programovanie pod Linuxom. Aby sme mohli písať zdrojový kód, potrebujeme editor. Doporučil by som Vim, Nano, alebo MCEDIT. V editore napíšeme program, uložíme ho s koncovkou '.c' a skompilujeme. V Linuxe existuje komplátor GCC. Použijeme ho tak, že do bashu zadáme: #gcc prvyProgram.c
. Náš skompilovaný program spustíme: ./a.out
.
Komentáre
Používame ich, keď potrebujeme urobiť dokumentáciu k zdrojovému kódu, alebo keď potrebujeme vysvetliť nejakú časť kódu pre ďalších programátorov, ktorí budú náš zdrojový kód čítať. Všetko, čo je za //
, sa v zdrojovom kóde neberie do úvahy.
Príklad použitia:
#include <stdio.h> main() { printf("Ahoj\n"); //Práve som použil komentár }
Výstup: Ahoj
Prvý program, alebo Hello World!
Vytvoríme si pomocou príkazu mkdir priečinok programovanie, otvoríme editor a začneme písať náš prvý zdrojový kód.
#include <stdio.h> // krok 1 main() // krok 2 { printf("Hello world!\n"); // krok 3 }
Krok 1: Kompilátor C-čka pozná pomerne málo funkcií. Napríklad aj funkcia printf je pre náš kompilátor neznáma. Ale programátori to samozrejme vyriešili a spravili tzv. knižnice. V týchto knižniciach je uložené veľké množstvo funkcií, ktoré môžeme používať. Ak teda chceme použiť funckiu printf, musíme kompilátoru povedať, kde sa táto funkcia nachádza. Daná funkcia sa nachádza v stdio.h (anglicky: standard input-output).
Krok 2: Každý program, ktorý napíšeme musí obsahovať funkciu main. Vo funkcii main program začína a aj končí. Každá funkcia v C (aj funkcia main) obsahuje telo, ktoré je ohraničené kučeravými zátvorkami.
Krok 3: V tele funkcie sa nachádzaju príkazy. My sme použili iba jeden príkaz a to printf. Za každý príkaz píšeme bodkočiarku. Príkaz printf slúži na vypísanie správy na obrazovku.
Program skompilujeme a spustíme podľa predošlého postupu. Ak všetko prebehlo v poriadku výstup by mal byť nasledovný: "Hello World!".
Znak \n znamená prejdi na nový riadok. Teda ak by sme chceli mať výstup nasledovný:
Ahoj Ako sa mas?
Tak by náš program vyzeral nasledovne:
#include <stdio.h> main() { printf("Ahoj\n Ako sa mas?\n"); }
Alebo by mohol vyzerať aj takto:
#include <stdio.h> main() { printf("Ahoj\n"); printf("Ako sa mas?\n"); }
To je ku dnešnému dielu asi všetko. V ďalšom pokračovaní seriálu si preberieme premenné. Ešte na záver dostanete 3 úlohy na precvičenie dnešnej témy.
1. Úloha: Napíšte program, ktorý bude mať nasledovný výstup: Ahoj, som tvoj prvý program v C
.
2. Úloha: Napíšte program, ktorý bude mať nasledovný výstup:
3. Úloha: Napíšte program, ktorý vypíše na štvrtý riadok: "Hello".
C99 komentare v clanku o jazyku vymyslenom v 70. rokoch
a pre zaujimavost si skus vsetko skompilovat s -Wall a ked chces aj -pedantic-errors
eat this
call puts
? Skoci na adresu ktora je na vrchole zasobnika?call ulozi register EIP (tu konkretne callq -- RIP) a skoci na symbol puts (z libc)
agama@bedna:~/c$ cat uloha2.S
.text
.extern puts
.global main
.type main, @function
main:
pushq %rbp
movq %rsp, %rbp
movq $pic, %rdi
call puts
movl $0, %eax /* return */
leave
ret
.data
pic: .ascii " oOOo\n" \
" /\\ oOOOOo\n" \
"/ \\ oOOo\n" \
"| | ||\n" \
"|__|--|-|-|-|-| ||\n"
agama@bedna:~/c$ gcc uloha2.S -lc -o uloha2
uloha2.S: Assembler messages:
uloha2.S:8: Error: bad register name `%rbp'
uloha2.S:9: Error: bad register name `%rsp'
uloha2.S:11: Error: bad register name `%rdi'
agama@bedna:~/c$
Ehm, alebo napiste vlastny navod pre expertov :) xixi
gcc uloha1.c -o prvy.out
$gcc -c program.c
$gcc -o program program.o
$./program
píš to bez toho "$"
ináč dá sa spustiť aj to a.out
BTW nedalo by sa v dalsom dieli povenovat trochu zakladnym matematickym operaciam? (scitanie, odcitanie, nasobenie, delenie, odmocnovanie, atd...)
Ináč keď ti tak o to ide tak na sčítavanie, odpočet,... sa poučívajú znaky +,-,*,/ tak ako aj v matike
Aby si pochopil to s tými premennými tak tu máš príklad: Skompiluj, pozeraj čo to robí a uč sa!!!
Program vyšiel pod GPL v3 :D
// prvé %d patrí premennej "i" ako je to vidieť za prvou čiarkou
// druhé %d patrí premennej "j" --> druhá čiarka
// tretie %d patrí samotnej operácii i+j - práve tu na nás vybafne výsledok.
V praxi tento riadok vypadá nasledovne:
Sčítanie: 10 + 5 = 15
Hodne zdaru pri štúdií... (Mimochodom tiež s Céčkom začínam. Začal som asi v polovici prázdnin.)
Moj nazor je tiez taky, ze od zaciatku treba cely main aj pre zaciatocnikov so vsetkym, co tam ma byt ( teda hlavne return 0;, kedze pri nezadani typu navratu je implicitne pouzity int, chybajuci return vyhadzuje warningy ), vysvetlenie by prislo potom v neskorsich dieloch.
Takisto by som zacal s troska vacsou teoriou na zaciatok, hello world asi az v druhom diely, staci sa pozret na nejake kvalitne publikacie, akym stylom su pisane.
Este by som sa rozpisal aj o editoroch alebo o vyvojovych prostrediach, program sa nemusi striktne pisat v konzole, predpokladam, ze kazdy zaciatocnik uz pouziva nejake graficke prostredie.
v tom tvojom odkaze tiez maju main(void)
inac nechapem co je take tazke na vysvetleni zmyslu return vo funkcii main() aby sa to muselo odkladat...
ozaj?
#include <stdio.h>
main()
{
printf(" oOOo\n");
printf(" /\ oOOOo\n");
printf(" / \ oOOo\n");
printf("| | ||\n");
printf("|___ |--|-|-|-|-| |\n");
}
#include <stdio.h>
main()
{
printf(" oOOo\n");
printf(" /\ oOOOo\n");
printf(" / \ oOOo\n");
printf("| | ||\n");
printf("|___ |--|-|-|-|-| |\n");
}
\ je speci znak