Professional Documents
Culture Documents
Bµi 1. Më ®Çu
Tãm t¾t lÞch sö ph¸t triÓn cña ng«n ng÷ C
Ng«n ng÷ lËp tr×nh C do Dennis Ritchie t¹o lËp vµo n¨m 1972 t¹i Bell Telephone
Laboratories. Môc ®Ých ban ®Çu cña ng«n ng÷ nµy lµ ®Ó thiÕt kÕ hÖ ®iÒu hµnh UNIX.
C lµ mét ng«n ng÷ m¹nh vµ mÒm dÎo nªn nã ®: ®îc rÊt nhiÒu ngêi sö dông. Kh¾p n¬i ng-
êi ta ®: b¾t ®Çu dïng nã ®Ó viÕt mäi lo¹i ch¬ng tr×nh. Tuy nhiªn, c¸c tæ chøc kh¸c nhau ®:
b¾t ®Çu sö dông c¸c version kh¸c nhau cña C, vµ ®: ph¸t sinh nhiÒu sù kh¸c nhau trong
c¸c thao t¸c lµm cho ngêi lËp tr×nh ph¶i ®au ®Çu. §Ó kh¾c phôc vÊn ®Ò nµy, n¨m 1983,
ViÖn Tiªu chuÈn Quèc gia cña Mü (ANSI) ®: thµnh lËp mét ñy ban ®Ó ®a ra mét ®Þnh
nghÜa chuÈn cho ng«n ng÷ C, ®îc gäi lµ ANSI Standard C.
Cã lÏ ph¶i nãi thªm mét chót vÒ tªn cña ng«n ng÷. Ng«n ng÷ nµy cã tªn lµ C v× tríc nã ®:
cã mét ng«n ng÷ ®îc gäi lµ B. Ng«n ng÷ B do Ken Thompson ph¸t triÓn còng t¹i Bell
Labs. Cã thÓ, B lµ ®Ó chØ tªn cña phßng thÝ nghiÖm, cßn C ch¾c lµ do ®øng sau B.
Trong thÕ giíi lËp tr×nh ngµy nay, cã rÊt nhiÒu ng«n ng÷ lËp tr×nh bËc cao ®Ó lùa chän,
ch¼ng h¹n nh C, Pascal, BASIC, Modula, v.v. TÊt c¶ ®Òu lµ nh÷ng ng«n ng÷ tuyÖt vêi phï
hîp cho hÇu hÕt c¸c c«ng viÖc lËp tr×nh. Nhng tuy vËy, vÉn cã mét vµi lý do ®Ó nhiÒu nhµ
lËp tr×nh chuyªn nghiÖp c¶m thÊy C lµ ng«n ng÷ ®øng ®Çu, v×:
C lµ mét ng«n ng÷ m¹nh vµ mÒm dÎo. H¹n chÕ duy nhÊt cña C chÝnh lµ sù h¹n chÕ trong t
duy trõu tîng cña chÝnh ngêi lËp tr×nh mµ th«i. C ®îc sö dông cho nhiÒu môc ®Ých kh¸c
nhau, nh thiÕt kÕ c¸c hÖ ®iÒu hµnh, c¸c bé so¹n th¶o v¨n b¶n, ®å ho¹, trang tÝnh, vµ thËm
chÝ lµm c¸c ch¬ng tr×nh dÞch cho c¸c ng«n ng÷ kh¸c.
C lµ mét ng«n ng÷ b×nh d©n ®îc nhiÒu ngêi lËp tr×nh chuyªn nghiÖp a dïng. B»ng chøng
lµ ®: cã rÊt nhiÒu ch¬ng tr×nh dÞch kh¸c nhau vµ nhiÒu tiÖn Ých kÌm theo.
C lµ mét ng«n ng÷ chuyÓn ®æi ®îc tøc lµ mét ch¬ng tr×nh C ®îc viÕt cho mét hÖ m¸y vi
tÝnh (vÝ dô IBM PC) cã thÓ ®îc dÞch vµ ch¹y trªn mét hÖ thèng kh¸c (vÝ dô DEC VAX)
mµ chØ cÇn thay ®æi chót Ýt hoÆc kh«ng cÇn thay ®æi g× c¶.
C lµ mét ng«n ng÷ ng¾n gän, nã chØ bao gåm mét sè c¸c tõ ®îc gäi lµ tõ khãa (keyword)
lµm c¬ së ®Ó t¹o ra c¸c c©u lÖnh cña ng«n ng÷.
Víi c¸c ®Æc ®iÓm trªn, C lµ sù lùa chän tuyÖt vêi ®èi víi mét ng«n ng÷ lËp tr×nh. Nhng cã
lÏ ngêi ta cßn nghe nãi vÒ C++ vµ mét kü thuËt lËp tr×nh míi ®îc gäi lµ lËp tr×nh híng ®èi
tîng. Còng kh«ng cã g× ®¸ng hoang mang cho l¾m v× thùc ra C++ chØ lµ mét ng«n ng÷ siªu
C víi tÊt c¶ nh÷ng g× mµ C cã céng thªm víi kü thuËt lËp tr×nh híng ®èi tîng. NÕu ai ®ã
b¾t ®Çu ngay b»ng viÖc häc C++, th× tÊt c¶ nh÷ng g× ®: ®îc d¹y khi häc C vÉn cßn ®îc ¸p
dông cho C++. Trong khi häc C, kh«ng nh÷ng chØ häc mét ng«n ng÷ lËp tr×nh phæ th«ng vµ
m¹nh nhÊt h«m nay mµ cßn tù chuÈn bÞ cho m×nh mét kü thuËt lËp tr×nh híng ®èi tîng
cho ngµy mai.
Khi t¹o lËp mét ch¬ng tr×nh trong C, cÇn ph¶i tu©n theo mét thø tù cña c¸c bíc sau ®©y:
X¸c ®Þnh c¸c ph¬ng ph¸p cÇn ph¶i sö dông trong khi viÕt ch¬ng tr×nh.
C¸c m: gèc lµ mét lo¹t c¸c c©u lÖnh, hoÆc lÖnh chØ thÞ cho m¸y tÝnh thùc hiÖn c¸c c«ng
viÖc mµ ngêi lËp tr×nh mong muèn. VÝ dô, díi ®©y lµ mét dßng cña m: gèc:
printf ("Chµo c¸c b¹n");
LÖnh nµy chØ thÞ cho m¸y tÝnh hiÖn trªn mµn h×nh th«ng ®iÖp Chµo c¸c b¹n.
C¸c m¸y tÝnh chØ hiÓu ®îc mét ng«n ng÷, ®ã lµ ng«n ng÷ m¸y (machine language). Bëi
vËy, tríc khi mét ch¬ng tr×nh C cã thÓ ch¹y ®îc trªn mét m¸y tÝnh, nã ph¶i ®îc dÞch tõ
c¸c m: gèc sang m: m¸y b»ng mét ch¬ng tr×nh ®îc gäi lµ ch¬ng tr×nh dÞch (compiler).
Ch¬ng tr×nh dÞch lÊy c¸c m: gèc lµm input vµ cho ra mét tÖp ®Üa chøa c¸c c©u lÖnh m:
m¸y t¬ng øng víi c¸c c©u lÖnh m: gèc. C¸c c©u lÖnh m: m¸y ®îc t¹o ra bëi ch¬ng tr×nh
dÞch ®îc gäi lµ c¸c m: ®Ých vµ tÖp ®Üa chøa chóng ®îc gäi lµ tÖp ®Ých. TÖp ®Ých cã tªn
trïng víi tªn tÖp gèc vµ lu«n cã ®u«i lµ OBJ. §u«i OBJ ®Ó chØ r»ng tÖp nµy lµ tÖp ®Ých vµ
sÏ ®îc sö dông bëi ch¬ng tr×nh kÕt nèi (linker).
CÇn ph¶i thùc hiÖn thªm mét bíc n÷a th× ch¬ng tr×nh míi cã thÓ ch¹y ®îc. Trong C cã
mét bé phËn ®îc gäi lµ th viÖn. Th viÖn cña C chøa c¸c m: ®Ých cña c¸c hµm ®: ®îc lËp
s½n. VÝ dô, hµm printf ®îc sö dông trong vÝ dô tríc lµ mét hµm th viÖn. C¸c hµm th viÖn
thùc hiÖn c¸c c«ng viÖc thêng hay ph¶i dïng ®Õn, ch¼ng h¹n nh hiÖn c¸c th«ng tin lªn
mµn h×nh, ®äc sè liÖu tõ c¸c tÖp ®Üa. NÕu mét ch¬ng tr×nh cã sö dông c¸c hµm th viÖn th×
tÖp ®Ých cña nã cÇn ph¶i ®îc kÕt nèi víi m: ®Ých cña c¸c hµm nµy ®Ó t¹o ra mét ch¬ng
tr×nh cã thÓ ch¹y ®îc. TÖp nµy cã tªn trïng víi tªn tÖp gèc vµ cã ®u«i lµ .EXE.
Sau khi dÞch vµ kÕt nèi cÇn ph¶i ch¹y thö ch¬ng tr×nh. NÕu kÕt qña nhËn ®îc kh«ng nh
mong muèn th× cÇn ph¶i t×m ra nguyªn nh©n dÉn ®Õn c¸c sai sãt vµ söa l¹i ch¬ng tr×nh cho
®óng. Khi cã bÊt kú mét thay ®æi nµo trong m: gèc, ch¬ng tr×nh ph¶i ®îc dÞch vµ kÕt nèi
l¹i. Chu tr×nh trªn sÏ ph¶i lÆp ®i lÆp l¹i cho ®Õn khi nµo nhËn ®îc kÕt qña nh mong muèn.
Mét ®iÓm lu ý cuèi cïng vÒ viÖc dÞch vµ kÕt nèi lµ, mÆc dï viÖc dÞch vµ kÕt nèi nh ®:
tr×nh bÇy trªn ®©y lµ hai giai ®o¹n t¸ch biÖt nhng nhiÒu ch¬ng tr×nh dÞch, ch¼ng h¹n c¸c
ch¬ng tr×nh dÞch ch¹y díi DOS l¹i gép hai bíc trªn thµnh mét. Cho dï nh vËy nhng vÉn
cø ph¶i hiÓu r»ng ®©y lµ hai qóa tr×nh riªng rÏ ngay c¶ khi chóng chØ ®îc thùc hiÖn b»ng
mét lÖnh.
KÕt luËn
C lµ mét c«ng cô lËp tr×nh m¹nh, th«ng dông vµ chuyÓn ®æi ®îc. Bµi nµy gi¶i thÝch c¸c b-
íc kh¸c nhau trong qóa tr×nh viÕt mét ch¬ng tr×nh C. §ã lµ chu tr×nh so¹n th¶o/dÞch/kÕt
nèi/kiÓm tra.
ViÖc m¾c lçi trong khi ph¸t triÓn ch¬ng tr×nh lµ mét ®iÒu kh«ng thÓ tr¸nh khái. Ch¬ng
tr×nh dÞch cña C sÏ ph¸t hiÖn c¸c lçi trong m: gèc vµ hiÖn mét th«ng b¸o lçi vÒ kiÓu lçi vµ
vÞ trÝ cña lçi. C¸c th«ng tin nµy gióp ngêi lËp tr×nh söa l¹i m: gèc mét c¸ch dÔ dµng. Tuy
nhiªn, ch¬ng tr×nh dÞch kh«ng ph¶i lóc nµo còng th«ng b¸o ®îc chÝnh x¸c kiÓu cña lçi
còng nh vÞ trÝ cña chóng. §«i khi ngêi lËp tr×nh ph¶i vËn dông c¸c kiÕn thøc vÒ C ®Ó ph¸t
hiÖn c¸c sai sãt ®: g©y ra th«ng b¸o lçi.
C lµ mét ng«n ng÷ cã ch¬ng tr×nh dÞch. §iÒu ®ã cã nghÜa lµ, sau khi m: gèc ®: ®îc dÞch
sÏ ph¸t sinh mét ch¬ng tr×nh cã thÓ ch¹y ®îc. Ch¬ng tr×nh nµy cã thÓ tù ch¹y mét m×nh.
NÕu muèn chuyÓn CHAO ®Õn nh÷ng ngêi nµo ®ã, ®iÒu duy nhÊt cÇn lµm lµ h:y chuyÓn
cho hä tÖp CHAO.EXE. Hä kh«ng cÇn tÖp gèc CHAO.C, hoÆc tÖp ®Ých CHAO.OBJ vµ
thËm chÝ ngay c¶ ch¬ng tr×nh dÞch C n÷a.
Sau khi ®, t¹o ®îc tÖp cã thÓ ch¹y ®îc, th× cã cÇn ph¶i gi÷ tÖp gèc hoÆc tÖp ®Ých n÷a
kh«ng?
NÕu tÖp gèc bÞ mÊt th× sau nµy kh«ng cßn c¸ch nµo kh¸c ®Ó cã thÓ thay ®æi ®îc ch¬ng
tr×nh ®: dÞch vµ kÕt nèi. Do vËy nªn gi÷ l¹i c¸c tÖp gèc. Nhng ®èi víi c¸c tÖp ®Ých th× l¹i
kh¸c. Cã mét vµi lý do cÇn ph¶i gi÷ l¹i c¸c tÖp ®Ých, tuy nhiªn nÕu nãi ngay b©y giê th×
cßn h¬i sím. Do vËy, cã thÓ xãa tÖp ®Ých mét khi ®: cã tÖp cã thÓ ch¹y ®îc. NÕu cÇn tÖp
®Ých, cã thÓ dÞch l¹i tõ tÖp gèc.
LuyÖn lËp
Môc LuyÖn tËp cho c¸c c©u hái ®Ó gióp ngêi ®äc cñng cè l¹i kiÕn thøc cña m×nh vµ c¸c
bµi tËp nh»m cung cÊp c¸c kinh nghiÖm khi sö dông nh÷ng ®iÒu ®: häc.
C©u hái
H:y nªu ba lý do t¹i sao C lµ mét lùa chän tèt nhÊt vÒ ng«n ng÷ lËp tr×nh.
C¸c bíc trong chu tr×nh ph¸t triÓn ch¬ng tr×nh lµ g×?
CÇn ph¶i gâ lÖnh nµo ®Ó dÞch mét ch¬ng tr×nh cã tªn PROG1.C b»ng ch¬ng tr×nh dÞch C ?
Ch¬ng tr×nh dÞch C kÕt nèi vµ dÞch b»ng mét lÖnh hay b»ng hai lÖnh riªng rÏ?
NÕu mét ch¬ng tr×nh ®: ®îc dÞch vµ nã kh«ng lµm viÖc nh mong muèn, th× nªn lµm nh thÕ
nµo ?
M: m¸y lµ g×?
Bµi tËp
H:y nhËp vµ dÞch ch¬ng tr×nh sau ®©y. Ch¬ng tr×nh nµy lµm viÖc g×? (kh«ng viÕt c¸c sè
hiÖu dßng khi so¹n ch¬ng tr×nh)
include <stdio.h>
main()
{
return 0;
2. NhËp vµ dÞch ch¬ng tr×nh sau. Ch¬ng tr×nh nµy lµm viÖc g×?
#include <stdio.h>
int x,y;
main()
printf( "X" );
return 0;
3. Ch¬ng tr×nh sau ®©y cã mét vÊn ®Ò. H:y nhËp vµ dÞch nã. C¸c dßng nµo sinh ra
th«ng b¸o lçi?
#include <stdio.h>
main();
4. Ch¬ng tr×nh sau ®©y còng cã mét vÊn ®Ò. H:y nhËp vµ dÞch nã. C¸c dßng nµo sinh
ra th«ng b¸o lçi?
#include <stdio.h>
main()
return 0;
5. Thay lÖnh sè 9 trong ch¬ng tr×nh ë bµi tËp 2 nh díi ®©y. DÞch vµ ch¹y l¹i
ch¬ng tr×nh. B©y giê ch¬ng tr×nh nµy lµm g×?
9: printf( "%c", 1 );
2: #include<stdio.h>
3: int a,b,c;
5: main()
6: {
9: scanf("%d", &a);
10
14:
16: c = tich(a,b);
18: }
19:
22: {
23: return ( x * y );
24: }
Ch¬ng tr×nh nµy sÏ hiÖn trªn mµn h×nh c¸c dßng kÕt qña sau:
35 nh©n 23 = 805
Bé phËn duy nhÊt cÇn ph¶i cã trong mäi ch¬ng tr×nh C lµ hµm main(). D¹ng ®¬n gi¶n
nhÊt cña nã lµ: tªn hµm main theo sau lµ mét cÆp dÊu ngoÆc trßn ( ) vµ mét cÆp dÊu ngoÆc
nhän { } . N»m gi÷a c¸c dÊu ngoÆc nhän lµ c¸c lÖnh t¹o nªn th©n chÝnh cña ch¬ng tr×nh.
Díi ®iÒu kiÖn b×nh thêng, ch¬ng tr×nh sÏ b¾t ®Çu thùc hiÖn tõ lÖnh thø nhÊt trong main()
vµ kÕt thóc b»ng lÖnh cuèi cïng trong main().
ChØ thÞ #include b¸o cho ch¬ng tr×nh dÞch cña C biÕt ph¶i thªm vµo ch¬ng tr×nh mét tÖp
trong khi dÞch. Mét tÖp ®îc thªm vµo lµ mét tÖp ®Üa riªng biÖt chøa c¸c th«ng tin cÇn thiÕt
cho ch¬ng tr×nh dÞch. Mét sè tÖp trong c¸c tÖp nµy (®«i khi cßn gäi lµ c¸c tÖp tiªu ®Ò -
header files) ®îc cung cÊp cïng víi ch¬ng tr×nh dÞch. TÊt c¶ c¸c tÖp nµy ®Òu cã ®u«i lµ
.H.
ChØ thÞ #include trong vÝ dô nµy cã nghÜa lµ "Céng thªm néi dung cña tÖp stdio.h". HÇu
hÕt c¸c ch¬ng tr×nh C ®Òu yªu cÇu mét hoÆc nhiÒu tÖp céng thªm.
§Þnh nghÜa biÕn
Mét biÕn lµ mét tªn gäi cho mét ®¹i lîng hoÆc mét ®èi tîng nµo ®ã. Mçi biÕn ®Òu ®îc
ph©n bæ mét ®Þa chØ trong bé nhí. Ch¬ng tr×nh C sö dông c¸c biÕn ®Ó lu gi÷ c¸c lo¹i d÷
liÖu kh¸c nhau trong qu¸ tr×nh thùc hiÖn ch¬ng tr×nh. Trong C, mét biÕn chØ cã thÓ ®îc sö
dông sau khi ®: ®îc ®Þnh nghÜa. Mét ®Þnh nghÜa biÕn cho ch¬ng tr×nh dÞch biÕt tªn cña
biÕn vµ kiÓu cña d÷ liÖu mµ nã lu gi÷. Trong vÝ dô mÉu, ®Þnh nghÜa ë dßng 3, int
a,b,c, ®Þnh nghÜa ba biÕn cã tªn lµ a, b, vµ c vµ mçi biÕn sÏ chøa mét gi¸ trÞ nguyªn
(integer). Trong Bµi 3 sÏ nãi râ h¬n vÒ c¸c biÕn vµ c¸c ®Þnh nghÜa biÕn.
Mét khai b¸o hµm cho ch¬ng tr×nh dÞch biÕt tªn vµ ®èi sè cña hµm sÏ ®îc sö dông trong
ch¬ng tr×nh. Khai b¸o nµy ph¶i xuÊt hiÖn tríc khi hµm ®îc sö dông. Khai b¸o hµm kh¸c
víi ®Þnh nghÜa hµm. Mét ®Þnh nghÜa hµm chøa c¸c lÖnh t¹o ra hµm ®ã.
C¸c lÖnh ch¬ng tr×nh (C¸c dßng 8, 9, 12, 13, 16, 17, 23)
C«ng viÖc thùc sù cña mét ch¬ng tr×nh C ®îc thùc hiÖn bëi c¸c lÖnh cña nã. C¸c lÖnh cña
C lµ: hiÖn c¸c th«ng tin trªn mµn h×nh, ®äc c¸c phÝm ®îc gâ vµo tõ bµn phÝm, thùc hiÖn
c¸c phÐp sè häc, gäi c¸c hµm, ®äc c¸c tÖp ®Üa, vµ tÊt c¶ c¸c thao t¸c kh¸c mµ mét ch¬ng
tr×nh cÇn ph¶i thùc hiÖn. Tõ bµi nµy trë ®i, mçi mét lÖnh C ®îc viÕt riªng trªn mét dßng
vµ lu«n lu«n ®îc kÕt thóc b»ng mét dÊu chÊm phÈy (;). Sau ®©y lµ c¸c gi¶i thÝch ng¾n gän
cho c¸c lÖnh cña ch¬ng tr×nh NHAN.C.
printf()
LÖnh printf() (c¸c dßng 8, 12, vµ 17) lµ mét hµm th viÖn dïng ®Ó hiÖn th«ng tin lªn
mµn h×nh. LÖnh nµy cã thÓ dïng ®Ó hiÖn mét th«ng b¸o v¨n b¶n ®¬n gi¶n (nh ë dßng 8 vµ
12) hoÆc mét th«ng b¸o vµ mét hoÆc nhiÒu biÕn ch¬ng tr×nh (nh ë dßng 17).
scanf()
LÖnh scanf() (c¸c dßng 9 vµ 13) còng lµ mét hµm th viÖn dïng ®Ó ®äc d÷ liÖu tõ bµn
phÝm vµ g¸n d÷ liÖu nµy cho mét hoÆc nhiÒu biÕn ch¬ng tr×nh.
LÖnh nµy gäi mét hµm cã tªn lµ tich().NghÜa lµ, nã thùc hiÖn c¸c lÖnh ch¬ng tr×nh
chøa trong hµm tich(). Nã cßn göi c¸c ®èi sè a vµ b cho hµm. Sau khi c¸c lÖnh trong
hµm tich() ®îc hoµn tÊt, tich() cßn ®a ra mét gi¸ trÞ cho ch¬ng tr×nh. Gi¸ trÞ nµy ®-
îc lu gi÷ trong biÕn cã tªn lµ c.
return (x * y);
LÖnh nµy lµ mét bé phËn cña hµm tich(). Nã tÝnh tÝch cña c¸c biÕn x vµ y råi chuyÓn
kÕt qña cho ch¬ng tr×nh ®: gäi tich().
Mét hµm lµ mét ®o¹n m: gèc ®éc lËp thùc hiÖn mét nhiÖm vô nhÊt ®Þnh. Mçi hµm ®Òu cã
mét tªn, vµ c¸c m: gèc cña hµm nµy ®îc thùc hiÖn mçi khi tªn hµm ®îc gäi trong mét ch-
¬ng tr×nh.
Hµm cã tªn tich() ë c¸c dßng 21-24 lµ mét hµm do ngêi sö dông tù ®Þnh nghÜa vµ tù
viÕt trong qu¸ tr×nh ph¸t triÓn ch¬ng tr×nh. Hµm nµy rÊt ®¬n gi¶n: nã chØ lµm mçi mét viÖc
lµ nh©n hai gi¸ trÞ víi nhau vµ ®a kÕt qña cho ch¬ng tr×nh ®: gäi nã.
C cßn cã c¸c hµm th viÖn ®îc cung cÊp cïng víi ch¬ng tr×nh dÞch. C¸c hµm th viÖn thùc
hiÖn hÇu hÕt c¸c c«ng viÖc c¬ b¶n nhÊt (nh c¸c thao t¸c trªn mµn h×nh, bµn phÝm, ®äc/ghi
®Üa) mµ mét ch¬ng tr×nh cÇn ®Õn. Trong vÝ dô nµy, printf() vµ scanf() lµ c¸c hµm
th viÖn.
C¸c chó thÝch trong ch¬ng tr×nh (C¸c dßng 1, 7, 11, 15, 20)
BÊt kú phÇn nµo mµ khëi ®Çu b»ng /* vµ kÕt thóc b»ng */ ®Òu ®îc gäi lµ mét chó thÝch.
Ch¬ng tr×nh dÞch bá qua tÊt c¶ c¸c chó thÝch vµ nh vËy th× chóng tuyÖt ®èi kh«ng ¶nh h-
ëng ®Õn sù ho¹t ®éng cña mét ch¬ng tr×nh. Cã thÓ viÕt bÊt cø thø g× trong mét chó thÝch
vµ nã sÏ kh«ng ¶nh hëng ®Õn ho¹t ®éng cña ch¬ng tr×nh. Mét chó thÝch cã thÓ chØ chiÕm
mét phÇn nµo ®ã cña mét dßng, toµn bé mét dßng, hoÆc còng cã thÓ nhiÒu dßng. Tuy
nhiªn, kh«ng nªn lång chó thÝch nµy trong mét chó thÝch kh¸c. HÇu hÕt c¸c ch¬ng tr×nh
dÞch ®Òu kh«ng chÊp nhËn lo¹i h×nh nµy.
NhiÒu ngêi míi b¾t ®Çu häc lËp tr×nh cho r»ng kh«ng cÇn ®Õn chó thÝch vµ lµm nh vËy lµ
mÊt th× giê. Thùc ra th× kh«ng h¼n lµ nh vËy. C¸c thao t¸c trong ch¬ng tr×nh cã thÓ rÊt râ
rµng vµ dÔ theo dâi trong khi ®ang viÕt. Nhng khi ch¬ng tr×nh trë nªn dµi h¬n vµ phøc t¹p
dÇn lªn, hoÆc khi cÇn ph¶i söa ®æi mét ch¬ng tr×nh ®: viÕt tõ nhiÒu th¸ng tríc th× c¸c chó
thÝch thËt lµ cã gi¸ trÞ. Râ rµng lµ cÇn ph¶i t¹o ra mét thãi quen dïng c¸c chó thÝch ®Ó lµm
s¸ng tá tÊt c¶ c¸c cÊu tróc vµ c¸c ho¹t ®éng trong ch¬ng tr×nh.
C¸c dÊu ngoÆc nhän ({ } ) dïng ®Ó nhãm c¸c dßng lÖnh thµnh mét khèi. C¸c lÖnh cña
mét hµm, kÓ c¶ hµm main(), ph¶i ®îc ®Ó trong c¸c dÊu ngoÆc nµy.
NhËp m: gèc cña NHAN.C (lu ý, kh«ng nhËp c¸c sè hiÖu dßng).
DÞch vµ kÕt nèi ch¬ng tr×nh b»ng c¸ch ra c¸c lÖnh thÝch hîp víi ch¬ng tr×nh dÞch hiÖn cã.
NÕu kh«ng cã sai sãt g× trong qóa tr×nh dÞch còng nh kÕt nèi, ch¹y ch¬ng tr×nh b»ng lÖnh
run, hoÆc b»ng c¸ch gâ nhan t¹i dÊu nh¾c cña DOS.
NÕu xuÊt hiÖn mét hoÆc nhiÒu th«ng b¸o lçi, quay l¹i tõ bíc hai vµ söa c¸c lçi ®: m¾c
ph¶i.
KÕt luËn
Bµi nµy tuy ng¾n nhng rÊt quan träng. Nã cho biÕt cÊu tróc vµ c¸c thµnh phÇn cña mét ch-
¬ng tr×nh C. Bé phËn duy nhÊt mµ mét ch¬ng tr×nh C yªu cÇu lµ hµm main(). C«ng viÖc
thùc sù cña ch¬ng tr×nh ®îc thùc hiÖn bëi c¸c lÖnh ch¬ng tr×nh. C¸c lÖnh nµy híng dÉn
cho m¸y tÝnh thùc hiÖn c¸c hµnh ®éng mµ ch¬ng tr×nh mong muèn. Bµi nµy cßn nãi vÒ
c¸c biÕn vµ c¸c ®Þnh nghÜa biÕn, vµ chØ ra lîi Ých cña viÖc sö dông c¸c chó thÝch vµ c¸ch
dïng chóng.
Ngoµi hµm main() ra, mét ch¬ng tr×nh C cßn cã thÓ sö dông hai kiÓu hµm kh¸c: c¸c
hµm th viÖn ®îc cung cÊp cïng víi bé ch¬ng tr×nh dÞch vµ c¸c hµm do ngêi sö dông tù
®Þnh nghÜa.
C¸c chó thÝch lµ ®Ó cho ngêi lËp tr×nh. Khi ch¬ng tr×nh dÞch chuyÓn c¸c m: gèc thµnh c¸c
m: ®Ých, nã sÏ vøt bá c¸c chó thÝch vµ c¸c vïng tr¾ng. §iÒu ®ã cã nghÜa lµ chóng kh«ng
hÒ cã mét t¸c ®éng nµo lªn ch¬ng tr×nh cã thÓ ch¹y ®îc. C¸c chó thÝch cã lµm cho ch¬ng
tr×nh gèc dµi h¬n, nhng ®iÒu ®ã còng kh«ng ®¸ng kÓ l¾m. VÒ l©u dµi, nªn sö dông c¸c chó
thÝch vµ c¸c kho¶ng trèng ®Ó ch¬ng tr×nh gèc dÔ ®äc vµ dÔ hiÓu h¬n.
Mét khèi lµ mét nhãm c¸c lÖnh ®îc ®Æt gi÷a c¸c dÊu ngoÆc nhän. Mét khèi cã thÓ ®îc sö
dông ë hÇu hÕt c¸c vÞ trÝ mµ t¹i ®ã cã thÓ sö dông mét lÖnh.
Lµm thÕ nµo ®Ó t×m thÊy danh s¸ch c¸c hµm th viÖn cã thÓ sö dông?
NhiÒu ch¬ng tr×nh dÞch cã kÌm theo tµi liÖu m« t¶ c¸c hµm th viÖn. Chóng thêng ®îc xÕp
theo thø tù tõ ®iÓn.
LuyÖn tËp
C©u hái
ThuËt ng÷ nµo dïng ®Ó chØ mét nhãm cña mét hoÆc nhiÒu lÖnh C ®îc ®Ó gi÷a c¸c dÊu
ngoÆc nhän?
Thµnh phÇn nµo ph¶i lu«n lu«n cã mÆt trong mét ch¬ng tr×nh C?
Lµm thÕ nµo ®Ó thªm vµo c¸c chó thÝch ch¬ng tr×nh vµ t¹i sao ph¶i dïng chóng?
Trong C cã hai kiÓu hµm. C¸c hiÓu ®ã lµ kiÓu g× vµ chóng kh¸c nhau nh thÕ nµo?
Bµi tËp
II. Dïng ch¬ng tr×nh sau ®©y ®Ó tr¶ lêi cho c¸c c©u hái sau:
/* BT2-2.C */
#include <stdio.h>
void in_dong(void);
main()
in_dong();
return 0}
void in_dong(void)
int dem;
++
for(dem = 0; dem = 21; dem )
printf("*");
/*BT2-3.C */
#include<stdio.h>
main()
int ctr;
return 0;
/* BT2-4.C */
#include<stdio.h>
main()
char buffer(256);
gets(buffer);
strlen( bufferr);
return 0;
Tríc khi ®i vµo c¸c biÕn, cÇn biÕt qua mét chót vÒ sù ho¹t ®éng cña bé nhí m¸y tÝnh.
Mét byte lµ ®¬n vÞ c¬ b¶n cña bé nhí d÷ liÖu cña m¸y tÝnh. C¸c kiÓu d÷ liÖu kh¸c nhau ®-
îc lu gi÷ b»ng c¸c sè lîng byte kh¸c nhau. B¶ng 3.1. cho thÊy sù kh¸c nhau nµy.
B¶ng 3.1. Sè lîng bytes cÇn thiÕt ®Ó lu gi÷ d÷ liÖu
Ch÷ c¸i x 1
Sè 100 2
Sè 120.145 4
Côm tõ Tù häc ng«n ng÷ C 17
Mét trang ®¸nh m¸y 3000 (gÇn ®óng)
RAM trong m¸y tÝnh ®îc tæ chøc theo kiÓu tuÇn tù, byte nµy tiÕp byte kia. Mçi byte cã
mét ®Þa chØ duy nhÊt ®Ó ®Þnh danh cho nã vµ ph©n biÖt nã víi tÊt c¶ c¸c byte kh¸c trong
bé nhí. C¸c ®Þa chØ ®îc g¸n cho c¸c vÞ trÝ bé nhí mét c¸ch tuÇn tù, khëi ®Çu tõ 0 cho ®Õn
hÕt bé nhí cña m¸y.
C¸c biÕn
Mét biÕn lµ mét tªn gäi vµ ®îc ph©n bæ mét ®Þa chØ lu tr÷. §Þa chØ nµy ®îc dïng ®Ó lu gi÷
gi¸ trÞ cña biÕn. Gi¸ trÞ nµy cã thÓ thay ®æi trong khi ch¬ng tr×nh thùc hiÖn.
Trong C, c¸c tªn biÕn ph¶i tu©n theo c¸c qui t¾c sau:
Tªn biÕn cã thÓ chøa c¸c ch÷, c¸c ch÷ sè vµ dÊu g¹ch díi (_).
Ký tù ®Çu tiªn cña tªn ph¶i lµ mét ch÷. Cã thÓ dïng dÊu g¹ch díi nh lµ ký tù ®Çu tiªn, nh-
ng kh«ng nªn lµm nh vËy v× xem ra kh«ng ®îc hîp lý cho l¾m.
Ch÷ hoa vµ ch÷ thêng lµ kh¸c nhau. Tøc lµ, Count vµ count lµ hai biÕn kh¸c nhau.
C¸c tõ giµnh riªng (keyword) cña C kh«ng ®îc sö dông lµm tªn biÕn. Mét keyword lµ mét
tõ mµ C sö dông nh lµ mét thµnh phÇn cña nã.
Sau ®©y lµ mét sè vÝ dô vÒ c¸c tªn biÕn hîp lÖ vµ kh«ng hîp lÖ trong C:
phantram /* hîp lÖ */
y2x5_fg7h /* hîp lÖ */
loinhuan_hangnam /* hîp lÖ */
V× C ph©n biÖt ch÷ hoa víi ch÷ thêng, nªn phantram, Phantram, vµ PHANTRAM lµ
tªn cña ba biÕn kh¸c nhau. Dï r»ng kh«ng b¾t buéc, nhng c¸c tªn biÕn trong C thêng ®îc
viÕt b»ng ch÷ thêng, cßn tªn cña c¸c h»ng th× ®îc viÕt b»ng ch÷ hoa.
§èi víi nhiÒu ch¬ng tr×nh dÞch, mét tªn biÕn cña C cã thÓ dµi tíi 31 ký tù. Víi ®é dµi nh
vËy, cã thÓ t¹o ra c¸c tªn biÕn nãi lªn ®îc ý nghÜa cña d÷ liÖu ®îc lu gi÷ trong chóng.
C¸c tªn cã bao hµm ý nghÜa thêng gåm nhiÒu tõ. Cã thÓ dïng dÊu g¹ch díi ®Ó ph©n c¸ch
c¸c tõ hoÆc c¸c côm tõ víi nhau cho dÔ hiÓu. Cßn mét kiÓu kh¸c gäi lµ bíu l¹c ®µ. Thay
cho dÊu c¸ch, ngêi ta viÕt hoa ch÷ ®Çu tiªn cña mçi tõ. VÝ dô, TyLeLaiSuat, hoÆc
TyleLaisuat. KiÓu nµy cã vÎ thuËn tiÖn h¬n v× kh«ng ph¶i gâ thªm dÊu g¹ch díi.
C cung cÊp mét sè kiÓu biÕn sè kh¸c nhau. T¹i sao l¹i ph¶i cÇn mét sè kiÓu biÕn kh¸c
nhau? §ã lµ v×, c¸c gi¸ trÞ sè kh¸c nhau yªu cÇu sè bytes ®Ó lu gi÷ kh¸c nhau vµ c¸c phÐp
to¸n sè häc cã thÓ thùc hiÖn trªn chóng còng kh¸c nhau. C¸c sè nguyªn nhá (vÝ dô, 1, 19,
-8) yªu cÇu Ýt byte ®Ó lu gi÷, vµ c¸c phÐp to¸n sè häc (céng, nh©n, v.v.) trªn c¸c sè nµy cã
thÓ ®îc thùc hiÖn rÊt nhanh b»ng m¸y tÝnh. Ngîc l¹i, nh÷ng sè nguyªn lín vµ c¸c sè dÊu
chÊm ®éng (vÝ dô, 123000000 hoÆc 0.000000345213) yªu cÇu nhiÒu bytes h¬n vµ thêi
gian tÝnh to¸n víi chóng còng l©u h¬n. B»ng c¸ch dïng c¸c kiÓu biÕn sè thÝch hîp, ch¬ng
tr×nh sÏ ch¹y mét c¸ch hiÖu qña h¬n.
C¸c biÕn sè cña C r¬i vµo hai nhãm chÝnh sau ®©y:
C¸c biÕn nguyªn (interger) dïng ®Ó lu gi÷ c¸c gi¸ trÞ kh«ng cã phÇn thËp ph©n. C¸c biÕn
nguyªn l¹i ph©n thµnh hai líp: biÕn nguyªn cã dÊu ®Ó ghi c¸c gi¸ trÞ nguyªn d¬ng vµ
nguyªn ©m; biÕn nguyªn kh«ng dÊu chØ ®Ó ghi c¸c gi¸ trÞ kh«ng ©m (bao gåm c¶ sè 0).
C¸c biÕn dÊu chÊm ®éng (Floating-point) gi÷ c¸c gi¸ trÞ cã phÇn thËp ph©n (sè thùc). Lu ý
mét ®iÓm lµ, tríc ®©y ta vÉn quen dïng dÊu phÈy ®Ó ng¨n c¸ch phÇn nguyªn vµ phÇn ph©n
cña mét sè, nªn míi cã tªn gäi dÊu phÈy ®éng, nay theo chuÈn cña ANSI th× ngêi ta dïng
dÊu chÊm thËp ph©n, bëi vËp míi cã tªn gäi dÊu chÊm ®éng. Tõ nay trë ®i sÏ dïng dÊu
chÊm thËp ph©n thay cho dÊu phÈy thËp ph©n. Cßn dÊu phÈy ®îc dïng lµm dÊu ng¨n c¸ch
hµng ngh×n, hµng triÖu, hµng tû, v.v.
MiÒn gÇn ®óng trong b¶ng nµy cã nghÜa lµ c¸c gi¸ trÞ cao nhÊt vµ thÊp nhÊt mµ mét biÕn
®: cho cã thÓ nhËn. §é chÝnh x¸c nghÜa lµ ®óng ®Õn bao nhiªu ch÷ sè cña gi¸ trÞ ®îc ghi
trong biÕn ®: cho. (VÝ dô, nÕu tÝnh 1/3, th× kÕt qña ®óng lµ 0.333333.... víi c¸c sè 3 cø
tiÕp tôc ®Õn v« h¹n. Mét biÕn víi ®é chÝnh x¸c ®¬n chØ ghi ®îc 7 con 3.)
Trong b¶ng nµy, c¸c kiÓu int vµ short int lµ gièng nhau. Nhng t¹i sao l¹i ph¶i cã
hai kiÓu kh¸c nhau nh vËy? C¸c kiÓu biÕn int vµ short int lµ gièng hÖt nhau trªn c¸c
hÖ thèng t¬ng thÝch víi c¸c m¸y tÝnh IBM-PC 16-bit, nhng chóng cã thÓ sÏ kh¸c nhau trªn
c¸c phÇn cøng kiÓu kh¸c. Trªn mét hÖ VAX, mét biÕn short vµ mét biÕn int kh«ng
cïng cì víi nhau. Mét biÕn short chiÕm 2 bytes, nhng mét biÕn int l¹i chiÕm nh÷ng 4
bytes. Do vËy, ®èi víi c¸c m¸y PC, hai kiÓu nµy lµ nh nhau.
Mäi biÕn cÇn ph¶i ®îc khai b¸o tríc khi ®îc ®em ra sö dông. Mét khai b¸o biÕn cho ch-
¬ng tr×nh dÞch biÕt tªn vµ kiÓu cña mét biÕn vµ cã thÓ khëi t¹o cho biÕn mét gi¸ trÞ nµo ®ã.
Mét khai b¸o biÕn cã d¹ng sau:
tªnkiÓu tªnbiÕn
TªnkiÓu x¸c ®Þnh kiÓu cña biÕn vµ ph¶i lµ mét trong c¸c keyword ®: cho trong B¶ng 3.2.
TªnbiÕn lµ tªn cña biÕn ®îc ®Æt theo c¸c qui t¾c ®: nãi ë phÇn tríc. Cã thÓ khai b¸o nhiÒu
biÕn cïng mét kiÓu trªn mét dßng, mçi biÕn c¸ch nhau b»ng mét dÊu phÈy. VÝ dô:
int tuoi, luong, con; /* ba biÕn nguyªn */
Keyword typedef
Tõ khãa typedef ®îc sö dông ®Ó t¹o lËp mét tªn míi cho mét kiÓu d÷ liÖu ®: cã. Nãi mét
c¸ch chÝnh x¸c, typedef t¹o ra mét kiÓu ®ång nghÜa. VÝ dô, lÖnh
t¹o ra kiÓu integer tõ kiÓu int. Sau ®ã, cã thÓ dïng integer ®Ó ®Þnh nghÜa c¸c biÕn
kiÓu int.
Khi mét biÕn ®îc khai b¸o, ch¬ng tr×nh dÞch sÏ dµnh ra mét vïng nhí cho biÕn nµy. Tuy
nhiªn, gi¸ trÞ ®îc nhí t¹i vïng nµy cha ®îc x¸c ®Þnh. Nã cã thÓ lµ 0, hoÆc cã thÓ lµ mét
gi¸ trÞ ngÉu nhiªn nµo ®ã cßn l¹i sau khi vïng nµy ®îc gi¶i phãng. Bëi vËy, tríc khi mét
biÕn ®îc sö dông, nã ph¶i ®îc khëi t¹o b»ng mét gi¸ trÞ x¸c ®Þnh nµo ®ã. ViÖc nµy cã thÓ
thùc hiÖn hoµn toµn ®éc lËp víi viÖc khai b¸o biÕn b»ng c¸ch dïng mét lÖnh g¸n. VÝ dô:
Cã thÓ khëi t¹o mét biÕn ngay khi khai b¸o b»ng c¸ch viÕt dÊu b»ng vµ gi¸ trÞ khëi t¹o
sau tªn biÕn. VÝ dô
int count = 0;
C¸c h»ng
Gièng nh mét biÕn, mét h»ng còng lµ mét tªn gäi vµ còng ®îc ph©n bæ mét ®Þa chØ trong
bé nhí. Nhng kh«ng gièng nh mét biÕn, gi¸ trÞ ®îc ghi trong mét h»ng kh«ng ®îc thay
®æi trong qu¸ tr×nh thùc hiÖn cña ch¬ng tr×nh. C cã hai kiÓu h»ng, mçi kiÓu l¹i cã c¸c c¸ch
sö dông kh¸c nhau.
Mét h»ng literal lµ mét gi¸ trÞ ®îc gâ trùc tiÕp vµo ch¬ng tr×nh gèc bÊt cø khi nµo nã ®îc
cÇn ®Õn. §©y lµ hai thÝ dô:
C¸c gi¸ trÞ 20 vµ .20 lµ c¸c h»ng literal. C¸c lÖnh trªn lu gi÷ c¸c gi¸ trÞ nµy vµo c¸c biÕn
count vµ tyle_thue.
Mét h»ng literal víi dÊu chÊm thËp ph©n lµ mét h»ng dÊu chÊm ®éng vµ ®îc ch¬ng tr×nh
dÞch C xem nh mét sè cã ®é chÝnh x¸c gÊp ®«i.
Mét h»ng kh«ng cã dÊu chÊm thËp ph©n ®îc ch¬ng tr×nh dÞch biÓu diÔn nh mét sè
nguyªn. C¸c h»ng nguyªn cã thÓ ®îc viÕt theo ba d¹ng díi ®©y:
Mét h»ng khëi ®Çu b»ng mét ch÷ sè kh¸c 0 ®îc xem lµ sè nguyªn c¬ sè 10 (decimal).
Mét h»ng nguyªn hÖ 10 cã thÓ chøa c¸c sè 0-9 vµ mét dÊu trõ hoÆc + ë ®»ng tríc.
Mét h»ng khëi ®Çu b»ng ch÷ sè 0 ®îc xem lµ mét sè nguyªn c¬ sè 8 (octal). C¸c h»ng hÖ
8 cã thÓ chøa c¸c ch÷ sè 0-7 vµ phÝa tríc cã thÓ cã thªm dÊu trõ hoÆc céng.
Mét h»ng khëi ®Çu b»ng 0x hoÆc 0X ®îc xem lµ mét h»ng hÖ c¬ sè 16 (hexadecimal).
C¸c h»ng hÖ 16 cã thÓ chøa c¸c ch÷ sè 0-9 vµ c¸c ch÷ A, B, C, D vµ F, vµ mét dÊu trõ
hoÆc céng ë ®»ng tríc.
Mét h»ng ký hiÖu lµ mét h»ng ®îc ký hiÖu bëi mét tªn gäi (symbolic) nµo ®ã. Gièng nh
mét h»ng literal, gi¸ trÞ cña mét h»ng symbolic kh«ng thÓ thay ®æi. Gi¸ trÞ thùc sù cña
h»ng symbolic chØ ®îc nhËp vµo khi nã ®îc ®Þnh nghÜa. ViÖc sö dông mét h»ng kiÓu nµy
y hÖt nh sö dông mét biÕn.
H»ng ký hiÖu cã hai u ®iÓm næi bËt so víi h»ng thùc sù. VÝ dô, ®Ó tÝnh chu vi vµ diÖn tÝch
cña mét h×nh trßn khi biÕt b¸n kÝnh, cã thÓ viÕt nh sau:
Tuy nhiªn, nÕu ®Þnh nghÜa mét h»ng ký hiÖu víi tªn lµ PI vµ gi¸ trÞ lµ 3.14, th× ®o¹n ch-
¬ng tr×nh trªn cã thÓ thay b»ng:
chu_vi = PI * (2 * ban_kinh);
Hai lÖnh nµy trë nªn s¸ng sña vµ dÔ hiÓu h¬n. Thay v× ph¶i b¨n kho¨n vÒ gi¸ trÞ 3.14 cã
nghÜa lµ g×, ë ®©y cã thÓ hiÓu ngay ®îc PI lµ g×.
¦u ®iÓm thø hai cña h»ng ký hiÖu lµ ë chç dÔ thay ®æi. TiÕp tôc vÝ dô trªn, ®Ó cho kÕt qña
cña ch¬ng tr×nh chÝnh x¸c h¬n cÇn ph¶i thay gi¸ trÞ cña PI lµ 3.14 b»ng mét gi¸ trÞ kh¸c
víi ®é chÝnh x¸c cao h¬n, ch¨ng h¹n 3.14159. NÕu ®: chãt dïng mét h»ng thùc sù cho sè
PI, th× b©y giê ph¶i duyÖt l¹i tÊt c¶ ch¬ng tr×nh ®Ó thay c¸c gi¸ trÞ 3.14 b»ng 3.14159. Víi
mét h»ng ký hiÖu, chØ cÇn thay ë ®óng mét chç, n¬i h»ng nµy ®îc ®Þnh nghÜa.
C cã hai ph¬ng ph¸p dïng ®Ó ®Þnh nghÜa mét h»ng ký hiÖu: chØ thÞ #define vµ tõ khãa
const. ChØ thÞ #define lµ mét trong nh÷ng chØ thÞ tiÒn xö lý sÏ ®îc tr×nh bÇy trong
c¸c bµi sau. ChØ thÞ nµy ®îc sö dông nh sau:
Dßng nµy t¹o lËp mét h»ng cã tªn lµ TENHANG víi gi¸ trÞ lµ giatri. Trong ®ã
giatri chÝnh lµ mét h»ng sè, cßn TENHANG tu©n theo c¸c qui luËt gièng nh cña tªn
biÕn. §Ó cho dÔ ph©n biÖt gi÷a mét h»ng vµ mét biÕn, ta nªn viÕt c¸c tªn h»ng b»ng ch÷
hoa, cßn tªn biÕn viÕt b»ng ch÷ thêng. Trong vÝ dô tríc, ®Ó ®Þnh nghÜa h»ng ký hiÖu PI, cã
thÓ viÕt nh sau:
#define PI 3.14159
Chó ý lµ, chØ thÞ #define kh«ng kÕt thóc b»ng dÊu chÊm phÈy (;).#define cã thÓ ®îc
®Æt ë bÊt cø chç nµo trong ch¬ng tr×nh gèc, nhng chØ cã hiÖu lùc cho phÇn m: gèc ®øng
sau nã mµ th«i. Nãi chung, ngêi ta hay gom tÊt c¶ c¸c #define l¹i víi nhau vµ ®Æt
chóng ë ®Çu tÖp ngay tríc hµm main().
C¸ch thø hai ®Ó ®Þnh nghÜa mét h»ng ký hiÖu lµ dïng tõ khãa const. Mét biÕn ®îc khai
b¸o lµ const th× kh«ng thÓ thay ®æi gi¸ trÞ trong khi ch¬ng tr×nh thùc hiÖn. §©y lµ mét
vµi vÝ dô:
const t¸c ®éng lªn tÊt c¶ c¸c biÕn trªn dßng khai b¸o. Trong dßng thø ba, no vµ
tyle_thue lµ c¸c h»ng ký hiÖu. NÕu trong ch¬ng tr×nh cã mét lÖnh nµo ®ã ®Þnh thay
®æi gi¸ trÞ cña mét biÕn h»ng, th× ch¬ng tr×nh dÞch sÏ sinh ra mét th«ng b¸o lçi. VÝ dô,
count = 200; /* Sai! Kh«ng thÓ g¸n l¹i hoÆc thay ®æi
gi¸ trÞ cña mét h»ng */
C¸c h»ng ký hiÖu ®îc ®Þnh nghÜa b»ng chØ thÞ #define vµ c¸c h»ng ®îc ®Þnh nghÜa b»ng
const cã sù kh¸c nhau. Sù kh¸c nhau nµy cã liªn quan ®Õn c¸c con trá vµ ph¹m vi cña
c¸c biÕn. Con trá vµ ph¹m vi cña c¸c biÕn lµ hai kh¸i niÖm quan träng sÏ ®îc tr×nh bÇy
trong c¸c bµi sau.
KÕt luËn
Bµi nµy ®: tr×nh bÇy kü vÒ c¸c biÕn sè dïng ®Ó lu gi÷ c¸c d÷ liÖu trong qóa tr×nh thùc hiÖn
ch¬ng tr×nh. Cã hai líp lín c¸c biÕn sè: nguyªn vµ dÊu chÊm ®éng. Trong mçi líp l¹i cã
mét sè kiÓu. ViÖc sö dông kiÓu nµo - int, long, float, hoÆc double - cho mét øng
dông lµ tuú thuéc vµo b¶n chÊt cña c¸c d÷ liÖu ®îc ghi trong biÕn. Mét biÕn cÇn ph¶i ®îc
khai b¸o tríc khi ®îc sö dông. Mét khai b¸o biÕn cho ch¬ng tr×nh dÞch biÕt tªn vµ kiÓu
cña biÕn.
Bµi nµy cßn nãi vÒ hai kiÓu h»ng cña C, h»ng thùc sù, vµ h»ng ký hiÖu. Kh«ng gièng nh
c¸c biÕn, gi¸ trÞ cña mét h»ng kh«ng ®îc thay ®æi trong qu¸ tr×nh thùc hiÖn ch¬ng tr×nh.
C¸c h»ng thùc sù lµ nh÷ng gi¸ trÞ ®îc gâ trùc tiÕp vµo ch¬ng tr×nh gèc bÊt cø khi nµo gi¸
trÞ nµy ®îc cÇn ®Õn. C¸c h»ng ký hiÖu ®îc ®Æt tªn vµ tªn nµy ®îc sö dông bÊt cø khi nµo
gi¸ trÞ cña h»ng ®îc cÇn ®Õn. C¸c h»ng ký hiÖu cã thÓ ®îc ®Þnh nghÜa vµ khëi t¹o b»ng chØ
thÞ #define hoÆc tõ khãa const.
Mét biÕn long int chiÕm nhiÒu RAM h¬n mét biÕn int. Trong c¸c ch¬ng tr×nh nhá,
®iÒu nµy kh«ng ¶nh hëng l¾m. Tuy nhiªn, khi ch¬ng tr×nh cµng ngµy cµng lín h¬n, th×
nªn nghÜ ®Õn viÖc sö dông thËt tiÕt kiÖm bé nhí.
§iÒu g× sÏ x¶y ra, nÕu g¸n mét sè thËp ph©n cho mét biÕn nguyªn?
Cã thÓ g¸n mét sè thËp ph©n cho mét biÕn nguyªn. NÕu biÕn nguyªn nµy lµ mét biÕn
h»ng th× ch¬ng tr×nh dÞch sÏ cho ra mét th«ng b¸o nh¾c nhë (warning). Gi¸ trÞ ®îc g¸n sÏ
bÞ chÆt ®i phÇn thËp ph©n. VÝ dô, nÕu g¸n gi¸ trÞ 3.14 cho mét biÕn nguyªn tªn gäi lµ pi,
th× pi sÏ chØ chøa 3. PhÇn ph©n .14 bÞ bá ®i.
§iÒu g× sÏ xÈy ra, nÕu g¸n mét sè vµo mét kiÓu kh«ng ®ñ lín ®Ó chøa nã?
NhiÒu ch¬ng tr×nh dÞch cho phÐp lµm ®iÒu nµy mµ kh«ng th«ng b¸o g× c¶. Tuy nhiªn, sè
nµy sÏ bÞ biÕn ®æi ®Ó võa víi kiÓu ®: cho vµ ®«i khi cßn lµm thay ®æi h¼n gi¸ trÞ cña nã.
VÝ dô, nÕu g¸n 32768 cho mét biÕn kiÓu nguyªn cã dÊu hai bytes, th× biÕn nµy sÏ nhËn gi¸
trÞ nguyªn lµ -1. NÕu g¸n gi¸ trÞ 65535 cho biÕn nguyªn nµy, th× nã sÏ chøa gi¸ trÞ -32768.
Nguyªn t¾c biÕn ®æi nµy lµ, lÊy gi¸ trÞ lín nhÊt mµ kiÓu ®îc g¸n cã thÓ chøa ®îc trõ ®i gi¸
trÞ ®îc g¸n vµ chøa kÕt qña vµo biÕn nµy.
§iÒu g× sÏ x¶y ra, nÕu g¸n mét sè ©m cho mét biÕn kiÓu kh«ng dÊu?
Còng gièng nh c©u hái tríc, ch¬ng tr×nh dÞch cã thÓ sÏ kh«ng b¶o g× c¶ nhng kÕt qña l¹i
kh«ng ®óng nh mong muèn. VÝ dô, nÕu g¸n -1 cho mét biÕn nguyªn kh«ng dÊu hai bytes,
th× ch¬ng tr×nh dÞch sÏ ®Æt vµo biÕn nµy sè cao nhÊt cã thÓ (65535).
LuyÖn lËp
C©u hái
Cã g× kh¸c nhau gi÷a mét biÕn nguyªn vµ mét biÕn dÊu chÊm ®éng?
H:y cho biÕt hai lý do t¹i sao l¹i ph¶i dïng mét biÕn dÊu chÊm ®éng ®é chÝnh x¸c gÊp ®«i
(kiÓu double) thay cho mét biÕn dÊu chÊm ®éng ®é chÝnh x¸c ®¬n (kiÓu float.)
ViÖc dïng mét h»ng ký hiÖu thay cho mét h»ng thùc sù cã nh÷ng u ®iÓm nµo?
H:y nªu hai ph¬ng ph¸p ®Ó ®Þnh nghÜa mét h»ng ký hiÖu cã tªn lµ MAXIMUM vµ cã gi¸ trÞ
lµ 100.
Sù kh¸c nhau gi÷a mét h»ng ký hiÖu vµ mét h»ng thùc sù lµ g×?
Bµi tËp
I. Nªn dïng kiÓu biÕn nµo ®Ó lu gi÷ tèt nhÊt c¸c gi¸ trÞ sau ®©y:
F. NhiÖt ®é.
G. Kho¶ng c¸ch b»ng kilomet tõ tr¸i ®Êt ®Õn mét ng«i sao nµo ®ã.
II. H:y t¹o lËp c¸c tªn biÕn thÝch hîp cho c¸c gi¸ trÞ trong bµi tËp mét.
III. H:y viÕt c¸c khai b¸o cho c¸c biÕn trong bµi tËp hai.
IV. C¸c biÕn nµo lµ hîp lÖ vµ kh«ng hîp lÖ trong sè c¸c biÕn sau? T¹i sao kh«ng
hîp lÖ?
A. 123abc
B. x
C. tong_so
D. trong_luong_#s
E. mot
F. tyle-phantram
G. BAN_KINH
H. Ban_kinh
I. ban_kinh
J. day_la_mot_bien_de_chua_chieu_rong_hop
x = 2+3;
lµ mét c©u lÖnh g¸n. Nã chØ ra cho m¸y tÝnh lÊy 2 céng víi 3, g¸n kÕt qña vµo biÕn x.
ThuËt ng÷ kho¶ng tr¾ng (whitespace) lµ ®Ó chØ c¸c dÊu c¸ch, tabs vµ c¸c dßng rçng trong
ch¬ng tr×nh gèc. Ch¬ng tr×nh dÞch C kh«ng xÐt ®Õn c¸c kho¶ng tr¾ng. Khi ch¬ng tr×nh
dÞch ®äc mét c©u lÖnh trong mét ch¬ng tr×nh gèc, nã sÏ ®äc tÊt c¶ c¸c ký tù trong c©u
lÖnh nµy cho ®Õn khi gÆp dÊu chÊm phÈy nhng bá qua tÊt c¶ c¸c kho¶ng tr¾ng. V× vËy,
c©u lÖnh x=2+3; trªn ®©y lµ hoµn toµn t¬ng ®¬ng víi
x = 2 + 3;
vµ víi
x =
3 ;
Mçi c©u lÖnh nªn viÕt trªn mét dßng vµ nªn cã mét dÊu c¸ch ®øng tríc vµ mét dÊu c¸ch
®øng sau mçi tªn biÕn. Tríc vµ sau mçi khèi nªn cã mét dßng rçng ®Ó dÔ nhËn biÕt tõng
khèi mét. Ngoµi ra, cã thÓ dïng tabs ®Ó ®Èy mét khèi thôt vµo so víi lÒ tr¸i nh»m t¹o ra
mét cÊu tróc cã tÝnh chÊt ph©n cÊp trong ch¬ng tr×nh.
Tuy nhiªn, trong mét h»ng c¸c ký tù (string constant) th× c¸c dÊu c¸ch vµ c¸c dÊu tabs l¹i
kh«ng bÞ bá qua, chóng ®îc coi lµ mét bé phËn cña x©u ký tù nµy. Mét x©u lµ mét d:y
c¸c ký tù. C¸c h»ng ký tù thùc sù lµ c¸c x©u ®îc ®Æt trong c¸c dÊu nh¸y vµ ®îc ch¬ng
tr×nh dÞch xö lý tõng ký tù mét.
NÕu chØ cã ®óng mét dÊu chÊm phÈy trªn mét dßng nµo ®ã, th× dßng nµy ®îc gäi lµ c©u
lÖnh rçng. C©u lÖnh rçng kh«ng thùc hiÖn bÊt kú hµnh ®éng nµo.
Mét c©u lÖnh phøc hîp (compound statement), hay cßn gäi lµ mét khèi (block), lµ mét
nhãm gåm hai hay nhiÒu c©u lÖnh cña C ®îc ®Æt trong c¸c dÊu ngoÆc nhän. §©y lµ mét vÝ
dô vÒ mét khèi:
{
printf("Xin chµo, ");
printf(c¸c b¹n!");
Trong C, mét c©u lÖnh phøc hîp cã thÓ ®îc sö dông ë bÊt cø n¬i nµo mµ mét c©u lÖnh ®¬n
cã thÓ ®îc sö dông. Chó ý r»ng, cã thÓ cã mét vµi c¸ch ®Ó viÕt c¸c dÊu ngoÆc. C©u lÖnh
phøc hîp sau ®©y lµ t¬ng ®¬ng víi c©u lÖnh trªn:
printf(c¸c b¹n!");}
Tuy nhiªn, viÖc ®Ó c¸c dÊu ngoÆc trªn hai dßng riªng biÖt lµm cho dÔ nhËn ra n¬i b¾t ®Çu
vµ n¬i kÕt thóc cña mét khèi h¬n.
BiÓu thøc ®¬n gi¶n nhÊt cña C lµ biÓu thøc chØ cã mét biÕn, mét h»ng thùc sù, hoÆc mét
h»ng ký hiÖu. §©y lµ mÊy vÝ dô:
PI /* mét h»ng ký hiÖu (®· ®Þnh nghÜa trong ch¬ng tr×nh )*/
C¸c biÓu thøc phøc t¹p h¬n bao gåm c¸c biÓu thøc ®¬n gi¶n h¬n ®îc liªn kÕt víi nhau
b»ng c¸c phÐp to¸n.
VÝ dô,
2 + 10
lµ mét biÓu thøc gåm c¸c biÓu thøc con 2 vµ 10, vµ phÐp to¸n +. BiÓu thøc 2+10 cho ra
kÕt qña lµ 12. Cã thÓ viÕt c¸c biÓu thøc phøc t¹p h¬n:
1.25 / 8 + 5 * ty_le + ty_le * ty_le / gia
Khi mét biÓu thøc chøa nhiÒu phÐp to¸n, th× viÖc tÝnh to¸n biÓu thøc nµy phô thuéc vµo
thø tù thùc hiÖn vµ ®é u tiªn cña phÐp to¸n.
C¸c biÓu thøc cña C cßn cã rÊt nhiÒu ®iÒu thó vi. H:y xÐt biÓu thøc sau:
x = a + 10;
C©u lÖnh nµy tÝnh biÓu thøc a + 10 vµ g¸n kÕt qña cho x. Ngoµi ra, toµn bé c©u lÖnh
nµy ®Õn lît nã còng lµ mét biÓu thøc tÝnh ra gi¸ trÞ cña biÕn sè n»m bªn tr¸i dÊu b»ng. V×
vËy cã thÓ viÕt c©u lÖnh sau:
y = x = a +10;
C©u lÖnh nµy g¸n gi¸ trÞ cña biÓu thøc a + 10 cho c¶ hai biÕn x vµ y. Còng cã thÓ viÕt
x = 6 + (y = 4 + 5);
KÕt qña cña c©u lÖnh nµy lµ y nhËn gi¸ trÞ 9 vµ x nhËn gi¸ trÞ 15. H:y chó ý ®Õn c¸c dÊu
ngoÆc ®¬n, chóng rÊt cÇn cho viÖc dÞch lÖnh nµy.
PhÐp g¸n
PhÐp g¸n ®îc ký hiÖu lµ dÊu b»ng (=). C¸ch dïng cña nã trong C cã kh¸c mét chót so víi
c¸ch dïng cña nã trong to¸n häc th«ng thêng. NÕu viÕt
x = y;
trong mét ch¬ng tr×nh C, th× kh«ng ph¶i cã nghÜa lµ "x b»ng y.", mµ lµ "g¸n gi¸ trÞ cña y
cho x." Trong mét c©u lÖnh g¸n, vÕ ph¶i cã thÓ lµ mét biÓu thøc bÊt kú cßn vÕ tr¸i ph¶i lµ
mét tªn biÕn. V× vËy, d¹ng cña c©u lÖnh g¸n lµ:
tenbien = bieuthuc;
Khi ®îc thùc hiÖn, bieuthuc ®îc íc lîng vµ gi¸ trÞ cña kÕt qña ®îc g¸n cho tenbien.
T¨ng ++ T¨ng gi¸ trÞ cña to¸n h¹ng lªn mét ++x, x++
Gi¶m -- Gi¶m gi¸ trÞ cña to¸n h¹ng ®i mét --x, x--
C¸c phÐp t¨ng vµ gi¶m chØ ®îc sö dông víi c¸c biÕn, kh«ng ®îc sö dông víi c¸c h»ng.
C¸c phÐp to¸n ®¬n nguyªn cã hai kiÓu: kiÓu tríc vµ kiÓu sau. Hai kiÓu nµy lµ kh«ng t¬ng
®¬ng. Chóng kh¸c nhau ë chç khi nµo viÖc t¨ng hoÆc gi¶m ®îc thùc hiÖn.
Khi ®îc sö dông ë kiÓu tríc, phÐp t¨ng vµ gi¶m sÏ thay ®æi gi¸ trÞ cña to¸n h¹ng tríc khi
to¸n h¹ng ®îc sö dông.
Khi ®îc sö dông ë kiÓu sau, phÐp t¨ng vµ gi¶m sÏ thay ®æi gi¸ trÞ cña to¸n h¹ng sau khi
to¸n h¹ng ®îc sö dông.
H:y xÐt hai c©u lÖnh sau ®©y sÏ thÊy râ ®iÒu ®ã:
x = 10;
y = x++;
Sau khi c¸c lÖnh nµy ®îc thùc hiÖn, x cã gi¸ trÞ lµ 11, cßn y cã gi¸ trÞ lµ 10; gi¸ trÞ cña x
®îc g¸n cho y, vµ sau ®ã x míi ®îc t¨ng thªm mét. Ngîc l¹i, c¸c c©u lÖnh
x = 10;
y = ++x;
cho x vµ y cïng mét gi¸ trÞ lµ 11; x ®îc t¨ng thªm mét, sau ®ã gi¸ trÞ cña nã míi ®îc
g¸n cho y.
Ch¬ng tr×nh sau minh häa sù kh¸c nhau gi÷a kiÓu tríc vµ kiÓu sau.
Ch¬ng tr×nh 4.1. MOT.C
/*Minh ho¹ kiÓu tríc vµ kiÓu sau cña phÐp to¸n mét to¸n h¹ng */
#include<stdio.h>
int a , b;
main()
/* §Æt c¶ a vµ b b»ng 5 */
a = b =5;
return 0;
5 4
4 3
3 2
2 1
1 0
C¸c phÐp to¸n häc nhÞ nguyªn
B¶ng 4.2. lµ danh s¸ch c¸c phÐp to¸n häc nhÞ nguyªn. Bèn phÐp ®Çu rÊt quen thuéc. PhÐp
thø n¨m, modulus (lÊy phÇn d cña phÐp chia), cã thÓ lµ cßn míi. Modulus cho phÇn d cña
phÐp chia to¸n h¹ng thø nhÊt cho to¸n h¹ng thø hai. VÝ dô, 11 modulus 4 b»ng 3.
Trõ - To¸n h¹ng thø nhÊt trõ to¸n h¹ng thø hai x - y
Chia / To¸n h¹ng thø nhÊt chia to¸n h¹ng thø hai x / y
Trong mét biÓu thøc cã chøa tõ hai phÐp to¸n trë lªn th× thø tù ®Ó thùc hiÖn chóng nh thÕ
nµo? TÇm quan träng cña c©u hái nµy cã thÓ ®îc minh häa b»ng c©u lÖnh g¸n sau ®©y:
x = 4 + 5 * 3;
x = 9 *3;
vµ x ®îc g¸n gi¸ trÞ 27. Ngîc l¹i, nÕu phÐp nh©n ®îc thùc hiÖn tríc, th× l¹i kh¸c:
x = 4 + 15;
vµ x ®îc g¸n gi¸ trÞ 19. Nh vËy lµ cÇn ph¶i cã c¸c luËt nµo ®ã vÒ thø tù thùc hiÖn cña c¸c
phÐp to¸n trong mét biÓu thøc. Thø tù nµy ®îc gäi lµ quyÒn u tiªn cña c¸c phÐp to¸n. Mçi
phÐp to¸n ®Òu cã mét quyÒn u tiªn x¸c ®Þnh. Khi mét biÓu thøc ®îc tÝnh to¸n, c¸c phÐp
to¸n cã quyÒn u tiªn cao h¬n sÏ ®îc thùc hiÖn tríc.
NÕu mét biÓu thøc chøa tõ hai phÐp to¸n trë lªn cã cïng mét h¹ng u tiªn, th× chóng ®îc
thùc hiÖn theo thø tù tõ tr¸i sang ph¶i.
Trë l¹i vÝ dô tríc, c©u lÖnh x = 4 + 5 *3; g¸n gi¸ trÞ 19 cho x bëi v× phÐp nh©n ®îc thùc
hiÖn tríc phÐp céng.
VÉn vÝ dô nµy, nÕu muèn céng 4 víi 5 sau ®ã míi nh©n víi 3 th× ph¶i lµm nh thÕ nµo? C
dïng dÊu ngoÆc ®Ó ®iÒu chØnh l¹i thø tù thùc hiÖn phÐp to¸n. Mét biÓu thøc con ®îc ®ãng
trong c¸c dÊu ngoÆc ®îc tÝnh tríc cho dï nã chøa phÐp to¸n nµo. V× vËy, ®Ó thùc hiÖn ý
®Þnh trªn, cã thÓ viÕt:
x = (4 + 5) * 3;
BiÓu thøc con 4 + 5 trong c¸c dÊu ngoÆc ®¬n ®îc tÝnh tríc vµ v× thÕ gi¸ trÞ ®îc g¸n cho x
lµ 27.
Cã thÓ dïng nhiÒu cÆp dÊu ngoÆc lång nhau trong mét biÓu thøc. Khi c¸c dÊu ngoÆc lång
nhau, viÖc tÝnh to¸n ®îc thùc hiÖn tõ biÓu thøc n»m trong cïng, sau ®ã tiÕn dÇn ra ngoµi.
x = 25 - (2 * (10 + (8 / 2))
BiÓu thøc trong nhÊt, 8 / 2, ®îc tÝnh tríc nhÊt vµ cho ra gi¸ trÞ 4.
25 - (2 * (10 + 4))
ChuyÓn ra ngoµi, biÓu thøc tiÕp theo, 10 + 4, ®îc tÝnh vµ cho ra gi¸ trÞ 14.
25 - (2 * 14)
BiÓu thøc ngoµi cïng, 2 * 14, ®îc tÝnh vµ cho gi¸ trÞ 28.
25 - 28
BiÓu thøc cuèi cïng, 25 - 28, ®îc tÝnh vµ g¸n gi¸ trÞ -3 cho biÕn x.
x = -3
Nh ®: nãi ë trªn, nÕu mét biÓu thøc C chøa nhiÒu h¬n mét phÐp to¸n cã cïng h¹ng u tiªn
th× chóng ®îc thùc hiÖn theo thø tù tõ tr¸i qua ph¶i. VÝ dô, trong biÓu thøc
w * x / y * z
w ®îc nh©n víi x tríc, chia kÕt qña thu ®îc cho y, vµ cuèi cïng míi nh©n kÕt qña cña
phÐp chia nµy víi z.
Tuy nhiªn víi c¸c møc u tiªn kh¸c nhau th× kh«ng cã g× ®Ó ®¶m b¶o thø tù tõ_tr¸i_qua_
ph¶i. XÐt biÓu thøc sau:
w * x / y + z / y
Theo thø tù u tiªn, phÐp nh©n vµ chia ®îc thùc hiÖn tríc phÐp céng. Tuy nhiªn C kh«ng
x¸c ®Þnh biÓu thøc con w * x / y ®îc tÝnh tríc hay tÝnh sau biÓu thøc con z / y. H:y xem
mét vÝ dô kh¸c:
w * x / ++y + z / y
NÕu biÓu thøc con thø nhÊt ®îc tÝnh tríc, th× y ®îc t¨ng thªm 1 khi biÓu thøc con thø hai
®îc tÝnh. NÕu biÓu thøc con thø hai ®îc tÝnh tríc, th× y cha ®îc t¨ng vµ kÕt qña sÏ kh¸c
nhau. Do vËy, nªn tr¸nh viÕt c¸c biÓu thøc kiÓu nµy trong ch¬ng tr×nh.
Lín h¬n > To¸n h¹ng 1 cã lín h¬n to¸n h¹ng 2 kh«ng? x > y
Nhá h¬n < To¸n h¹ng 1 cã nhá h¬n to¸n h¹ng 2 kh«ng? x < y
Lín h¬n >= To¸n h¹ng 1 cã lín h¬n hoÆc b»ng to¸n x>=y
hoÆc b»ng h¹ng 2 kh«ng?
Nhá h¬n <= To¸n h¹ng 1 cã nhá h¬n hoÆc b»ng to¸n h¹ng x<=y
hoÆc b»ng 2 kh«ng?
C©u lÖnh if
C¸c phÐp quan hÖ ®îc sö dông chñ yÕu ®Ó x©y dùng c¸c biÓu thøc quan hÖ dïng trong c¸c
c©u lÖnh if vµ while. C¸c c©u lÖnh trong mét ch¬ng tr×nh C thêng ®îc thùc hiÖn tõ
trªn xuèng díi theo ®óng thø tù xuÊt hiÖn cña chóng trong ch¬ng tr×nh gèc. Mét c©u lÖnh
®iÒu khiÓn cã thÓ sÏ lµm thay ®æi thø tù thùc hiÖn nµy. C¸c c©u lÖnh ®iÒu khiÓn ch¬ng
tr×nh cã thÓ lµm cho c¸c c©u lÖnh kh¸c thùc hiÖn nhiÒu lÇn hoÆc kh«ng thùc hiÖn lÇn nµo
phô thuéc vµo tõng hoµn c¶nh cô thÓ. C©u lÖnh if lµ mét trong c¸c c©u lÖnh ®iÒu khiÓn
ch¬ng tr×nh cña C. Ngoµi ra cßn cã c¸c c©u lÖnh kh¸c, nh for, do vµ while.
ë d¹ng th«ng thêng, c©u lÖnh if íc lîng mét biÓu thøc vµ thay ®æi sù thùc hiÖn ch¬ng
tr×nh theo kÕt qña cña viÖc íc lîng nµy. D¹ng cña if nh sau:
if (biÓu thøc)
c©u_lÖnh;
NÕu biÓu thøc ®îc ®¸nh gi¸ lµ ®óng th× c©u_lÖnh ®îc thùc hiÖn. NÕu biÓu thøc nhËn gi¸
trÞ sai, th× c©u_lÖnh kh«ng ®îc thùc hiÖn vµ ®iÒu khiÓn chuyÓn ®Õn c©u lÖnh ®øng ngay
sau c©u lÖnh if.
Chó ý lµ c¶ hai dßng if (biÓu thøc) vµ c©u_lÖnh; míi hîp thµnh mét c©u
lÖnh if hoµn chØnh vµ chóng kh«ng ph¶i lµ hai c©u lÖnh t¸ch rêi. Do vËy, kh«ng ®îc
viÕt dÊu chÊm phÈy ë cuèi dßng if.
Mét c©u lÖnh if cã thÓ ®iÒu khiÓn viÖc thùc hiÖn cña nhiÒu c©u lÖnh kh¸c b»ng c¸ch
dïng mét khèi. V× vËy, cã thÓ viÕt mét c©u lÖnh if nh sau:
if (biÓu_thøc)
c©u_lÖnh1;
c©u_lÖnh2;
c©u_lÖnhn;
}
Trong khi lËp tr×nh, c©u lÖnh if rÊt hay ®îc sö dông cïng víi c¸c biÓu thøc quan hÖ, hay
nãi mét c¸ch kh¸c, "h:y thùc hiÖn (c¸c) c©u lÖnh sau chØ khi ®iÒu kiÖn nh thÕ nµy lµ
®óng". VÝ dô,
if ( x > y )
y = x;
C©u lÖnh nµy g¸n gi¸ trÞ cña x cho y chØ khi x lín h¬n y. NÕu x kh«ng lín h¬n y, th×
kh«ng cã phÐp g¸n nµo xÈy ra c¶.
Mét c©u lÖnh if cã thÓ chøa mét mÖnh ®Ò else (ngîc l¹i). MÖnh ®Ò nµy ®îc ®a vµo if nh
sau:
if (biÓu_thøc)
c©u_lÖnh1;
else
c©u_lÖnh2;
NÕu biÓu_thøc lµ ®óng, c©u_lÖnh1 ®îc thùc hiÖn. NÕu biÓu_thøc lµ sai,
c©u_lÖnh2 ®îc thùc hiÖn. C¶ c©u_lÖnh1 vµ c©u_lÖnh2 ®Òu cã thÓ lµ mét khèi.
D¹ng 1
if ( biÓu_thøc )
c©u _lÖnh1
c©u_lÖnh_tiÕp_theo
§©y lµ d¹ng ®¬n gi¶n nhÊt cña c©u lÖnh if. NÕu biÓu_thøc lµ ®óng, th× c©u_lÖnh1
®îc thùc hiÖn. NÕu biÓu_thøc lµ kh«ng ®óng, th× c©u_lÖnh1 bÞ bá qua.
D¹ng 2
if ( biÓu_thøc )
c©u _lÖnh1
else
c©u _lÖnh2
c©u_lÖnh_tiÕp_theo
§©y lµ d¹ng chung nhÊt cña c©u lÖnh if. NÕu biÓu_thøc mµ ®óng th× c©u_lÖnh1 ®-
îc thùc hiÖn, ngîc l¹i c©u_lÖnh2 ®îc thùc hiÖn.
D¹ng 3
if (biÓu_thøc1)
c©u _lÖnh1
else if(biÓu_thøc2)
c©u _lÖnh2
else
c©u_lÖnh3
c©u_lÖnh_tiÕp_theo
§©y lµ d¹ng if lång nhau. NÕu biÓu_thøc1 lµ ®óng, th× c©u_lÖnh1 ®îc thùc hiÖn,
ngîc l¹i, biÓu_thøc2 ®îc kiÓm tra. NÕu biÓu_thøc1 lµ kh«ng ®óng, vµ
biÓu_thøc2 lµ ®óng, th× c©u_lÖnh2 ®îc thùc hiÖn. NÕu c¶ hai cïng kh«ng ®óng,
c©u_lÖnh3 ®îc thùc hiÖn. ChØ cã mét trong ba c©u lÖnh nµy ®îc thùc hiÖn mµ th«i.
VÝ dô 1
thue = .50;
else
thue = .25;
VÝ dô 2
if ( tuoi <15 )
printf( "ThiÕu niªn");
printf("Ngêi lín");
else
printf("Ngêi giµ");
Ch¬ng tr×nh 4.5. Tr×nh diÔn c¸ch tÝnh c¸c biÓu thøc quan hÖ
#include <stdio.h>
int a;
main()
return 0;
a = 1
a = (5 != 5)
a = 0
a = (12 == 12) + (5 != 1)
a = 2
Xem ra kÕt qña nµy míi ®Çu cã vÎ h¬i l¹. Khi dïng c¸c biÓu thøc quan hÖ, cã mét lçi mµ
ngêi ta hay m¾c ph¶i lµ chØ dïng mét dÊu = cho phÐp quan hÖ b»ng. BiÓu thøc
x = 5
cho gi¸ trÞ 5 ®ång thêi g¸n 5 cho x. ThÕ nhng, biÓu thøc
x == 5
th× l¹i cho ra 0 hoÆc 1 (phô thuéc vµo gi¸ trÞ cña x cã b»ng 5 hay kh«ng) vµ kh«ng lµm
thay ®æi gi¸ trÞ cña x. NÕu do s¬ xuÊt mµ viÕt lµ
if (x = 5)
th× th«ng b¸o nµy lu«n lu«n ®îc in ra v× biÓu thøc ®îc kiÓm tra ë c©u lÖnh if bao giê
còng nhËn gi¸ trÞ ®óng bÊt kÓ x cã b»ng 5 hay kh«ng.
Cuèi cïng, cÇn ph¶i nh¾c l¹i mét lÇn n÷a lµ, c¸c phÐp quan hÖ ®îc dïng ®Ó t¹o lËp c¸c
mèi quan hÖ gi÷a c¸c biÓu thøc. Mét biÓu thøc quan hÖ cho ra mét gi¸ trÞ sè, b»ng 0 (nÕu
biÓu thøc cã nghÜa lµ sai) hoÆc b»ng 1 (nÕu biÓu thøc cã nghÜa lµ ®óng).
Gièng nh c¸c phÐp to¸n häc ®: nãi trong bµi tríc, c¸c phÐp quan hÖ còng cã c¸c quyÒn u
tiªn riªng, quyÕt ®Þnh thø tù mµ chóng ®îc thùc hiÖn trong mét biÓu thøc cã nhiÒu phÐp
to¸n. Ngoµi ra, còng cã thÓ dïng c¸c dÊu ngoÆc ®Ó thay ®æi thø tù thùc hiÖn trong mét
biÓu thøc cã dïng c¸c phÐp quan hÖ.
Tríc hÕt, tÊt c¶ c¸c phÐp quan hÖ ®Òu cã quyÒn u tiªn thÊp h¬n c¸c phÐp to¸n häc. V× vËy,
nÕu viÕt
if ( x + 2 > y)
th× 2 ®îc céng víi x tríc, sau ®ã, kÕt qña nµy míi ®îc ®em so s¸nh víi y. MÖnh ®Ò trªn t-
¬ng ®¬ng víi
if ( (x + 2 ) > y)
trong ®ã, dÊu ngoÆc ®îc sö dông ®Ó lµm râ thªm thø tù thùc hiÖn cña c¸c phÐp trong biÓu
thøc.
!= == 2
V× vËy,
bëi v×, ®Çu tiªn C tÝnh biÓu thøc y > z ®Ó cho ra mét gi¸ trÞ hoÆc lµ 0 hoÆc lµ 1. TiÕp
theo, C x¸c ®Þnh xem x cã b»ng gi¸ trÞ thu ®îc tõ bíc mét hay kh«ng.
Kh«ng nªn dïng c©u lÖnh g¸n trong c¸c c©u lÖnh if. §iÒu ®ã cã thÓ lµm cho ngêi ®äc
ch¬ng tr×nh dÔ nhÇm lÉn. Hä cã thÓ hiÓu nhÇm lµ ch¬ng tr×nh viÕt kh«ng ®óng vµ söa l¹i
phÐp g¸n thµnh phÐp b»ng logic. §ång th¬× còng kh«ng nªn dïng phÐp "kh«ng b»ng" (!=)
trong mét c©u lÖnh if cã chøa mét mÖnh ®Ò else. Tèt h¬n c¶ lµ nªn dïng phÐp "b»ng"
(==) cïng víi else. VÝ dô, c©u lÖnh
if (x != y )
c©u_lÖnh1;
else
c©u_lÖnh2;
if ( x = y )
c©u_lÖnh2;
else
c©u_lÖnh1;
C¸c phÐp logic
§«i khi, cÇn ph¶i ®Æt ra nhiÒu c©u hái vÒ c¸c mèi quan hÖ cña c¸c biÓu thøc nµo ®ã cïng
mét lóc. C¸c phÐp logic cña C ®¶m b¶o viÖc kÕt nèi hai hay nhiÒu biÓu thøc quan hÖ thµnh
mét biÓu thøc ®Ó tÝnh ra ®îc mét gi¸ trÞ hoÆc lµ ®óng hoÆc lµ sai. Ba phÐp logic cña C ®îc
cho trong B¶ng 4.7.
kh«ng ! ! biÓu_thøc1
Ph¬ng thøc lµm viÖc cña c¸c phÐp logic ®îc chØ ra trong B¶ng 4.8.
B¶ng 4.8. Ph¬ng thøc lµm viÖc cña c¸c phÐp logic
(biÓu_thøc1 && biÓu_thøc2) True (1) chØ khi c¶ biÓu_thøc1 vµ biÓu_thøc2 ®Òu true; ngîc
l¹i false (0).
(biÓu_thøc1 ¦ ¦ biÓu_thøc2) True (1) nÕu biÓu_thøc1 hoÆc biÓu_thøc2 lµ true; false (0) chØ
khi c¶ hai ®Òu false.
C¸c biÓu thøc quan hÖ cña C cho ra gi¸ trÞ 0 ®Ó biÓu hiÖn lµ sai vµ cho ra gi¸ trÞ 1 ®Ó biÓu
hiÖn lµ ®óng. Tuy nhiªn, bÊt kú mét gi¸ trÞ sè nµo còng cã thÓ ®îc biÓu hiÖn nh lµ ®óng
hoÆc nh lµ sai khi nã ®îc sö dông trong mét biÓu thøc hoÆc mét c©u lÖnh ®ang chê mét
gi¸ trÞ logic (tøc lµ, mét gi¸ trÞ ®óng hoÆc sai). C¸c qui t¾c ¸p dông cho c¸c trêng hîp nµy
lµ:
x = 125;
if (x)
Trong trêng hîp nµy, gi¸ trÞ cña x ®îc in ra, v× x cã gi¸ trÞ kh¸c kh«ng nªn biÓu thøc (x)
®îc c©u lÖnh if cho lµ ®óng. Bëi vËy, ®èi víi mäi biÓu thøc C th× c¸ch viÕt
C¶ hai ®Òu cho gi¸ trÞ ®óng nÕu biÓu_thøc kh¸c kh«ng, vµ c¶ hai ®Òu cho gi¸ trÞ sai
nÕu biÓu_thøc b»ng kh«ng. B»ng phÐp to¸n kh«ng (!), ta còng cã thÓ viÕt
C¸c phÐp logic còng cã mét thø tù u tiªn ngay trong chóng vµ c¶ víi c¸c phÐp kh¸c. PhÐp
! (not) cã cïng ®é u tiªn víi c¸c phÐp to¸n häc mét ng«i (®¬n nguyªn) ++ vµ -- V× vËy,
phÐp ! cã thø tù u tiªn cao h¬n tÊt c¶ c¸c phÐp quan hÖ vµ tÊt c¶ c¸c phÐp to¸n häc hai
ng«i (nhÞ nguyªn).
Ngîc l¹i, c¸c phÐp && (and) vµ ¦ ¦ (or) cã thø tù u tiªn thÊp h¬n nhiÒu, thÊp h¬n tÊt c¶ c¸c
phÐp to¸n häc vµ c¸c phÐp quan hÖ. && cã thø tù u tiªn cao h¬n ¦ ¦ . Còng nh ®èi víi c¸c
phÐp kh¸c, dÊu ngoÆc cã thÓ ®îc sö dông ®Ó thay ®æi thø tù thùc hiªn khi dïng c¸c phÐp
logic.
x = x + 5;
Dïng mét phÐp g¸n phøc hîp, gÇn nh mét c¸ch viÕt t¾t cña phÐp g¸n, cã thÓ viÕt ng¾n
gän:
x += 5;
Tæng qu¸t, phÐp g¸n phøc hîp cã d¹ng có ph¸p nh sau (trong ®ã op lµ mét phÐp nhÞ
nguyªn):
biÓu_thøc1 op= biÓu_thøc2
NÕu biÓu_thøc1 cho ra true (kh¸c 0), th× biÓu thøc tæng thÓ nµy cã gi¸ trÞ cña biÓu_thøc2.
NÕu biÓu_thøc1 cho ra false (b»ng 0), th× biÓu thøc tæng thÓ cã gi¸ trÞ cña biÓu_thøc3. VÝ
dô, c©u lÖnh
x = y ? 1 : 100;
g¸n 1 cho x, nÕu y lµ true, hoÆc g¸n 100 cho x, nÕu y lµ false. T¬ng tù nh vËy, ®Ó z lÊy gi¸
trÞ lín h¬n trong hai gi¸ trÞ x vµ y, cã thÓ viÕt
z = (x > y) ? x : y;
PhÐp ®iÒu kiÖn h¬i gièng víi c©u lÖnh if. C©u lÖnh trªn cã thÓ viÕt nh sau:
if ( x > y)
z = x;
else
z = y;
C¶ hai biÓu thøc ®îc tÝnh nhng biÓu thøc bªn tr¸i ®îc tÝnh tríc.
BiÓu thøc tæng thÓ nhËn gi¸ trÞ cña biÓu thøc bªn ph¶i.
t¨ng a, råi t¨ng b, sau ®ã g¸n gi¸ trÞ cña b (cha t¨ng) cho x. V× phÐp ++ ë ®©y lµ kiÓu sau,
nªn gi¸ trÞ cña b - tríc khi ®îc t¨ng - ®îc g¸n cho x. Dïng c¸c dÊu ngoÆc lµ cÇn thiÕt bëi
v× phÐp dÊu phÈy cã thø tù u tiªn thÊp, thËm chÝ thÊp h¬n c¶ phÐp g¸n.
KÕt luËn
Trong bµi nµy, nhiÒu kh¸i niÖm quan träng cña C ®: ®îc tr×nh bµy: mét c©u lÖnh C lµ g×,
c¸c kho¶ng tr¾ng kh«ng cã ý nghÜa ®èi víi ch¬ng tr×nh dÞch cña C, vµ c¸c c©u lÖnh cña C
®Òu kÕt thóc b»ng mét dÊu chÊm ph¶y. Ngoµi ra, chóng ta còng ®: häc vÒ mét c©u lÖnh
phøc hîp hay cßn gäi lµ mét khèi. Mét khèi chøa tõ hai c©u lÖnh trë lªn vµ ®îc ®ãng
khung trong c¸c dÊu ngoÆc nhän, cã thÓ ®îc sö dông ë bÊt kú chç nµo mµ mét c©u lÖnh
®¬n cã thÓ ®îc sö dông.
NhiÒu c©u lÖnh ®îc t¹o thµnh tõ mét sè biÓu thøc vµ c¸c phÐp to¸n. Mét biÓu thøc lµ mét
mÖnh ®Ò nµo ®ã dïng ®Ó tÝnh ra ®îc mét gi¸ trÞ sè. C¸c biÓu thøc phøc hîp cã thÓ chøa
nhiÒu biÓu thøc ®¬n gi¶n h¬n (biÓu thøc con).
C¸c phÐp to¸n lµ c¸c ký hiÖu cña C, dïng ®Ó híng dÉn m¸y tÝnh thùc hiÖn mét thao t¸c
trªn mét hoÆc nhiÒu biÓu thøc. Mét sè phÐp to¸n lµ ®¬n nguyªn, cã nghÜa lµ chóng thao
t¸c trªn mét to¸n h¹ng ®¬n. Tuy nhiªn, hÇu hÕt c¸c phÐp cña C ®Òu lµ nhÞ nguyªn, thao t¸c
trªn hai to¸n h¹ng. Cã mét phÐp tam nguyªn, ®ã lµ phÐp ®iÒu kiÖn. C¸c phÐp to¸n cña C
cã mét quyÒn u tiªn ph©n cÊp quyÕt ®Þnh thø tù mµ theo ®ã c¸c phÐp to¸n sÏ ®îc thùc hiÖn
trong mét biÓu thøc cã chøa nhiÒu phÐp to¸n.
C¸c phÐp to¸n cña C trong bµi nµy ®îc chia lµm ba kiÓu:
C¸c phÐp to¸n häc thùc hiÖn c¸c phÐp sè häc trªn c¸c to¸n h¹ng cña chóng.
C¸c phÐp quan hÖ thùc hiÖn viÖc so s¸nh gi÷a c¸c to¸n h¹ng cña chóng.
C¸c phÐp logic thao t¸c trªn c¸c biÓu thøc true/false. 0 ®Ó biÓu diÔn cho false, 1 ®Ó biÓu
diÔn cho true.
C¸c kho¶ng tr¾ng (dÊu c¸ch, dßng tr¾ng, tabs) thêng ®îc dïng ®Ó lµm ch¬ng tr×nh dÔ ®äc
h¬n. Khi ch¬ng tr×nh ®îc dÞch, c¸c kho¶ng tr¾ng bÞ bá qua, vµ v× thÕ chóng kh«ng cã hiÖu
lùc g× ®èi víi ch¬ng tr×nh ®: dÞch vµ kÕt nèi.
Sù kh¸c nhau gi÷a c¸c phÐp ®¬n nguyªn vµ nhÞ nguyªn lµ g×?
C¸c phÐp ®¬n nguyªn thao t¸c trªn mét biÕn cßn phÐp nhÞ nguyªn lµm viÖc víi hai biÕn.
Lµ c¶ hai. Ch¬ng tr×nh dÞch ®ñ th«ng minh ®Ó biÕt ph¶i lµm g× víi phÐp nµy. Nã biÕt ph¶i
dïng kiÓu nµo c¨n cø vµo sè biÕn trong biÓu thøc ®îc sö dông. Trong c©u lÖnh sau, nã lµ
®¬n nguyªn
x = -y;
x = a - b;
LuyÖn tËp
C©u hái
1. C©u lÖnh sau ®©y ®îc gäi lµ g×, vµ ý nghÜa cña nã ra sao?
x = 5 + 8;
3. Trong mét biÓu thøc cã chøa nhiÒu phÐp to¸n, c¸i g× quyÕt ®Þnh thø tù thùc hiÖn cña
chóng?
4. NÕu mét biÕn x cã gi¸ trÞ lµ 10, gi¸ trÞ cña x vµ a lµ bao nhiªu sau mçi lÇn c¸c c©u lÖnh
sau ®©y ®îc thùc hiÖn t¸ch biÖt?
a = x++;
a = ++x;
7. H:y viÕt thªm c¸c dÊu ngoÆc vµo biÓu thøc trong c©u 6 ®Ó biÓu thøc míi cã gi¸ trÞ b»ng
16.
8. NÕu mét biÓu thøc ®îc ®¸nh gi¸ lµ false th× biÓu thøc nµy cã gi¸ trÞ lµ mÊy?
9. PhÐp to¸n nµo cã thø tù u tiªn cao h¬n?
a. == hay <
b. * hay +
c. != hay ==
Bµi tËp
1. Ch¬ng tr×nh sau viÕt kh«ng ®îc hay l¾m. H:y nhËp vµ dÞch xem nã cã ch¹y kh«ng.
#include<stdio.h>
3. H:y viÕt l¹i ch¬ng tr×nh 4.1 ®Ó ®Õm theo chiÒu t¨ng dÇn thay cho gi¶m dÇn.
4. ViÕt mét c©u lÖnh if ®Ó g¸n gi¸ trÞ cña x cho biÕn y chØ khi x n»mg gi÷a 1 vµ 20. Gi÷
nguyªn y kh«ng ®æi nÕu x kh«ng n»m trong miÒn nµy.
6. ViÕt l¹i c¸c c©u lÖnh if lång nhau sau ®©y b»ng mét c©u lÖnh if ®¬n vµ c¸c phÐp
phøc hîp.
if (x < 1)
if ( x >10)
c©u_lÖnh;
b. 10 % 3 * 3 - (1 + 2)
c. ((1 + 2) * 3)
d. (5 == 5)
e. (x = 5)
8. NÕu x = 4, y = 6, vµ z = 2, h:y xem c¸c mÖnh ®Ò sau ®©y lµ true hay false
a. if (x == 4)
b. if (x != y - z)
c. if (z = 1)
d. if (y)
9. ViÕt mét c©u lÖnh if ®Ó kh¼ng ®Þnh mét ngêi lµ ngêi lín (21 tuæi) nhng cha giµ (65
tuæi).
10. H:y söa cho ch¬ng tr×nh sau ®©y ch¹y ®óng.
#ινχλυδε <στδιο.η>
ιντ ξ = 1;
µαιν()
if (x == 1);
otherwise
return