Svmmarivm
Programma qvod sententias tantvm conectit semper idem facit, qvaliacvmqve svnt eivs data; vt eis respondeat, decernere debet. Haec lectio decisiones lingvae C++ tractat: if et else, qvae inter dvas vias secvndvm condicionem eligvnt; catenas ex else if, qvae inter plvres eligvnt et in qvibvs ordo condicionvm statvit qvem casvm qvisqve ramvs cvret; decisiones nidificatas et insidias else pendentis; deniqve switch cvm enum class, qvae inter valores discretos nominatos eligvnt, compilatore monente si casvs deest avt si vnvs in seqventem labitvr. Notio qvae omnia conivngit est analysis per casvs: decisio recta copiam introitvvm in casvs disivnctos dividit qvi eam totam tegvnt, et qvisqve casvs vno tentamine in interiore svo et altero in qvoqve margine svo confirmatvr.
Proposita discendi
- Decisiones simplices, catenatas et nidificatas scribere qvae omnes casvs specificationis cvrent.
- Confirmare casvs catenae ex
ifetelse ifdisivnctos et exhavstivos esse, et singvlos introitvs tentaminis pro singvlis casibvs designare. switchcvmenum classad valores discretos adhibere, et explicare qvid compilator moneat si casvs deest.elsependens et casvm in seqventem lapsvm inswitchagnoscere et corrigere.
if et else
Forma decisionis
Lectio A problemate ad algorithmvm tres formas exposvit qvibvs omnis algorithmvs constrvitvr: seqventiam, decisionem, repetitionem. Hvcvsqve programmata cvrsvs seqventiae fvervnt, praeter aliqvod if in parte 1 anticipatvm; haec lectio secvndam formam in C++ scribit. Decisio condicionem aestimat, id est expressionem generis bool qvalis svnt eae lectionis Relationes et logica, et vnam clavsvram exseqvitvr si condicio vera est, alteram si falsa:
if (condicio) { // exseqvitvr si condicio vera est} else { // exseqvitvr si condicio falsa est}Condicio semper inter parentheses ponitvr. Membrvm else optionale est: sine eo, si condicio falsa est, nihil fit et programma pergit ad sententiam qvae decisionem seqvitvr. Vtroqve casv dvae viae in fine conivngvntvr, ita vt decisio, extrinsecvs visa, vna sententia sit cvm vno introitv et vno exitv, sicvt lectio 1.1 postvlabat.
Lectio Arithmetica ostendit a % b signvm dividendi habere, ita vt cvm et valeat , cvm residvvm Evclidevm, qvod nvmqvam negativvm est, valeat 1; et nvntiavit tvtam viam id corrigendi esse addere solvm cvm residvvm negativvm est. Programma svpponit.
#include <iostream>#include <print>int main(){ int a{}; int b{}; std::cin >> a >> b; int r{a % b}; if (r < 0) { r = r + b; } std::println("Residvvm Evclidevm ex {} per {}: {}", a, b, r);}-7 2Residvvm Evclidevm ex -7 per 2: 1Variabilis r iam non est constans, qvia decisio eam mvtare potest. Figvra dvas vias possibiles seqvitvr.
Demonstratio
Exsecvtio ad decisionem pervenit
riam compvtato, et primvm condicionemr < 0aestimat: rhombvs est vnicvs programmatis locvs vbi viae separantvr.Si condicio vera est, vt cvm et 2, clavsvra ipsivs
ifexseqvitvr:ra ad 1 transit.Si falsa est, vt cvm 7 et 2, clavsvra tota praeteritvr, et
rvalorem svvm servat.Ambae viae in eodem loco conivngvntvr, et inde programma vtroqve casv eodem modo pergit: sententia qvae eventvm scribit semper exseqvitvr.
Cvm else, decisio inter dvas actiones eligit qvae se invicem exclvdvnt. Condicio anni bisextilis lectionis Relationes et logica bool prodvcit; decisio id in modvm agendi programmatis convertit.
#include <iostream>#include <print>int main(){ int year{}; std::cin >> year; const bool isLeap{(year % 4 == 0 && year % 100 != 0) || year % 400 == 0}; if (isLeap) { std::println("{} bisextilis est: Febrvarivs dies 29 habet.", year); } else { std::println("{} bisextilis non est: Febrvarivs dies 28 habet.", year); }}19001900 bisextilis non est: Febrvarivs dies 28 habet.Condicioni nomen dare, vt isLeap, separat qvid decernatvr ab eo qvod decisione fit.
Semper vnci cvrvi
Grammatica lingvae C++ vncos cvrvos omittere sinit cvm clavsvra vnam tantvm sententiam habet: if (r < 0) r = r + b; validvm est. Atqvi sine vncis decisio solam sententiam seqventem regit, et qvod lector regi credit ab incisvra pendet, qvam compilator neglegit. Si haec ita svnt, qvaevis mvtatio posterior (secvndam sententiam addere, primam in commentarivm vertere) significationem mvtare potest qvin textvs id ostendat. Ex qvo seqvitvr regvla cvrsvs: clavsvra ipsivs if avt ipsivs else semper vncos cvrvos habet, etiamsi vnam tantvm sententiam continet.
Error omnivm brevissimvs regvlam confirmat. Pvnctvm et virgvla post parentheses est sententia vacva, et decisio eam sententiam vacvam regit; clavsvra qvae seqvitvr iam non pertinet ad if et semper exseqvitvr.
#include <print>int main(){ const int stock{12}; if (stock == 0); { std::println("Merx exhavsta"); } std::println("Vnitates in promptv: {}", stock);}main.cpp: In function ‘int main()’:main.cpp:6:20: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body] 6 | if (stock == 0); | ^main.cpp:6:5: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation] 6 | if (stock == 0); | ^~main.cpp:7:5: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’ 7 | { | ^Merx exhavstaVnitates in promptv: 12Programma nvntiat mercem exhavstam esse, qvamqvam 12 vnitates svpersvnt. GCC dvo monita dat: -Wempty-body vncos cvrvos circa corpvs vacvvm svadet, et -Wmisleading-indentation significat clavsvram ita incisam esse qvasi if eam regeret. Alter error classicvs, if (x = 0) loco if (x == 0), in lectione Compilare, exseqvi et configvrare visvs est: assignatio nihilvm valet, qvod in false convertitvr, et -Wparentheses monet. Vtroqve casv programma compilatvr; sine monitis error lateret.
Vnci cvrvi aliam qvoqve consecvtionem habent: variabilis intra clavsvram ipsivs if declarata ibi tantvm exstat. Si valor in ramo compvtatvs post decisionem adhibetvr, variabilis ante declaratvr, vt r in exemplo residvi; ambitvs in lectione Parametra et ambitvs tractabitvr.
Operator condicionalis
Cvm dvo rami decisionis valorem tantvm eligvnt, C++ formam breviorem praebet: condicio ? a : b valet a si condicio vera est et b si falsa, et solvm elementvm electvm aestimat. Dissimiliter ab if, qvod sententia est, operator condicionalis est expressio: valorem et genvs habet, et poni potest vbicvmqve expressio ponitvr, exempli gratia in initialisatione constantis, qvod if non sineret nisi const relicto.
#include <iostream>#include <print>int main(){ int a{}; int b{}; std::cin >> a >> b; const int larger{a > b ? a : b}; std::println("Maior: {}", larger); std::println("{} {}", b, b == 1 ? "vnitas" : "vnitates"); const auto mixed{a > b ? a : 0.5}; std::println("Genvs commvne: {:.1f}", mixed); std::println("Sine parenthesibvs: {}", 10 + a > b ? 1 : 0); std::println("Cvm parenthesibvs: {}", 10 + (a > b ? 1 : 0));}7 3Maior: 73 vnitatesGenvs commvne: 7.0Sine parenthesibvs: 1Cvm parenthesibvs: 11Primi dvo versvs vsvm ostendvnt qvi clarificat: maiorem eligere et verbvm cvm nvmero accommodare, sine tota sententia in dvobvs ramis repetenda. Tertivs ostendit expressionem vnvm genvs habere, qvicvmqve ramvs eligitvr: si dvo eventvs diversi generis svnt, in genvs commvne convertvntvr per conversiones arithmeticas solitas lectionis Arithmetica; hic int et double dant double, et 7 electvs vt 7.0 servatvr. Dvo vltimi praecedentiam ostendvnt: operator condicionalis inter eos est qvi infimam praecedentiam habent, ita vt sine parenthesibvs condicio sit 10 + a > b et valor 1, non 11. Cvm condicionalis pars expressionis maioris est, inter parentheses ponitvr.
Operator obscvrat simvl ac ab eo plvs qvam valorem eligere petitvr. Nidificatvs, vt in a > b ? (a > c ? a : c) : (b > c ? b : c), cogit decisionem nidificatam mente reconstrvere sine vncis cvrvis qvi eam legibilem facivnt; et propter effectvs adhibitvs, vt in ok ? std::println("ita") : std::println("non"), est if dissimvlatvm. Regvla cvrsvs est eo vti solvm ad inter dvos valores breves eligendvm, non nidificato; cetera omnia per if scribvntvr.
Argvmentvm oneratvr…