ROB Bowden: Dette er den mer komfortabel delen, men det betyr ikke at hvis du føler at du ikke er mer komfortabel du vil ikke lære ting her. Så la oss komme i gang. Har du lysbilder går rett inn i ting. Er jeg i ferd med å bare ta det akkurat nå? Bytte bærbare datamaskiner. ALLISON: Du ønsker ikke å introdusere deg selv, Rob? ROB Bowden: Åh, jeg er Rob. Dette er mitt femte år TF-ing CS50. GABRIEL: Jeg er Gabriel. Jeg er head TF av CS50. Jeg var TF i fjor og i år. ALLISON: Og jeg er Alison, og dette er mitt andre år TF-ing CS50. ROB Bowden: All right, så denne tingen til venstre, forhåpentligvis du har sett det før. Hvis ikke fordi du laste det ned selv, du burde ha sett det på forelesning. Så dette er CS50 apparatet, og han hadde en litt av en beskrivelse av det på forelesning. Men i utgangspunktet er det bare deg kjører et operativsystem system innenfor drifts systemet slik at vi kan gi deg programmer uten behov å bekymre deg, oh er dette kommer til å jobbe på både Windows og Mac, eller hvis noen av dere er allerede bruker Linux, Linux. Det er bare ment å være en vanlig spiller feltet slik at alle har det nøyaktig samme miljø. Så hvis du ikke har lastet ned dette allerede, du bør laste den ned, fordi du er kommer til å trenge det for problemet sett. Og det er en to gigabyte laste ned, så det kan ta litt tid. På Harvard vil det gå fort. Så CS50 apparatet. Nå i begynnelsen, skal vi snakke om bare en haug med kommandolinje ting, og så ved at jeg mener å jobbe i denne lille miljøet her borte. Og legg merke til alle ting Jeg sier akkurat her akkurat nå kommer til å fungere hvis du er inne i en terminal inne i apparatet, eller hvis du er inne i den gedit terminalvindu innsiden av apparatet. Så disse miljøene er identiske. Men jeg kommer til å gå en tredje rute. Og legg merke til her nede denne lille IP-adresse her. Så du trenger ikke å gjøre dette, men denne IP address-- nå hvis I-- unntatt det er blokkert av denne tingen. OK, slik at IP-adressen Over i en terminal her-- så denne terminalen i løpet her er en terminal i min Mac. Så dette er på ingen måte i dag i forbindelse med apparatet i det hele tatt. Og hvis du er på Windows, så du er kommer til å trenge å laste ned noe spesielt for dette, særlig folk har en tendens til å bruke Putty, P-U-T-T-Y. Så hva jeg skal gjøre er å skrive SSH og deretter den IP-adressen. Vel, jharvard på den IP-adressen. Så 192.168.24.220. Denne skremmende melding, ignorere det. Bare skriv ja. Dette er CS50 i en boks. Det spør etter passordet ditt. Og så i mange av disse sammenhenger der den ber om passord, [uhørbart]. Vi har fått mange spørsmål der det står at det er faktisk ikke å skrive. Det betyr ikke vise deg tegnene passordet mens du skriver, om noe, for en sikkerhetsfunksjon, fordi hvis noen ser over skulderen din og de ser star star star star, så de vet at passordet ditt er fire tegn. Så ideen er det vil be deg om passord, type. Det kommer ikke til å vise du tegnene, men det er faktisk akseptere dem. I dette tilfellet, helst du gang se en passordforespørsel arbeider med maskinen, Passordet skal være rød. Så crimson. Og nå her inne i dette vindu som er i min Mac, Jeg er i utgangspunktet ha nøyaktig samme syn som innsiden av en terminal i apparatet. Så du trenger ikke å gjøre dette. Du kan gjøre alt du ønsker inne i apparatet. Jeg nesten aldri faktisk gjør noe i apparatet. Jeg nesten alltid minimere det, og nå Jeg jobber SSH inn i apparatet. Hvis noe, hvis du har en tregere datamaskin, du kanskje merke en forskjell. Jeg gjør dette fordi jeg foretrekker dette terminalvindu. Det har noen funksjoner som Jeg kan splitte vinduet, og nå kan jeg SSH i gjennom apparatet. Jeg fikk to SSH som skjer på en gang. Hvis datamaskinen er spesielt treg og du jobber i apparatet, og du skjønner at dette er virkelig laggy, uansett. Har en tendens til å være mye raskere hvis du er SSH-ed i. Men ellers kan du jobbe uansett. PUBLIKUM: Hva betyr SSH? ROB Bowden: Sikre skjell, noe sånt? Hva betyr SSH mener? GABRIEL: Secure shell. ALLISON: Det er bare sikkert skall. ROB Bowden: Secure shell. Det er en protokoll som you-- det er en sikker protokoll, så kryptert. Folk kan ikke Snoop nettverket og se hva du sier til noe du er SSH-ed til. Og faktisk, i olden dager CS50, så i 2009 da jeg var førsteårsstudent, slik at du jobbet på CS50 oppgavesett, var du SSH-ed til noen server at vi ga deg tilgang til, og du jobbet med det. Så du ikke har dette grafisk apparatet. Du hadde ikke gedit. Du hadde ikke alle disse tingene som du kunne visuelt pek og klikk. Du måtte jobbe i dette grensesnittet. Jeg foretrekker å jobbe i dette grensesnittet. Så en del av det vi skal å gå til over akkurat nå er en haug av kommandoer som du bør begynner å bli kjent med så du går på kurset. Og ærlig talt, når du blir vant til dem, det er så mye raskere å arbeide i dette miljøet enn det er å jobbe med finder, dra og klikke ting. Så her er vi. Nå er jeg bare SSH-ed i, og så standard beliggenhet-- deg så noen av disse kommandoene i klassen, men vi vil gå over alle dem igjen. Standardplassering vi er i er hjemmekatalog. Og katalog, bare et annet ord for mappe. Så vi er i hjemmekatalogen. Skriv inn ls, liste filene i denne katalogen. Tydeligvis jeg laget en blah.c tidligere. Så vi har en stasjonær katalog. Du merker det syntax highlighting? Den lyseblå utheving indikerer en katalog og den rette hvite indikerer bare en vanlig fil. Så det kommer til å være noen andre fargene du ser. En kjørbar fil er trolig kommer å være grønn eller noe sånt. OK, så vi er i hjemmekatalogen. Nå hvis jeg ønsker å gå inn i en annen katalog, er cd kommandoen jeg vil. Så endre katalog, og deretter passere navnet på katalogen at du ønsker å gå inn. Så her har vi fire alternativer. Jeg kan gå inn i nedlastinger, og nå ser vi her har det oppdatert denne parentes å si jeg er i ~ / nedlastinger. Så hva er tilde? Det er en forkortelse for hjemmekatalogen. Så nesten alt du gjør er å gå til være med hensyn til hjemmekatalogen, og pwd er bare en kommando Jeg bruker en gang i året at bare skriver ut den gjeldende katalogen. Og så du ser her at ~ / Nedlastinger virkelig løser til / home / jharvard / nedlastinger. Så / home / jharvard er min hjemmekatalog. Så vi kan cd dot dot. Nå dot dot er en spesiell katalog som alltid refererer til en katalog opp. Så hvis jeg er i ~ / nedlastinger, deretter cd dot prikk kommer til å bringe meg til Tilde. Hva gjør vi tror cd dot dot kommer til å bringe meg til nå? Det vil bringe meg til / home. Så Tilde av utskriftsarbeidskatalog, Jeg er i nå / home / jharvard. en katalog opp fra det, nå står det her / home. Nå cd dot dot. Nå er jeg i rotkatalogen, og du kan ikke gjøre det igjen. Du vil bare bo i rotkatalogen alltid. Rotkatalogen har en hel haug med ting som, hvis du ønsker å se nærmere på, du kan. For eksempel, hvis jeg går i bin, som inneholder alle disse binærfiler, for eksempel ls, og cd, og alle disse tingene. Så disse kommandoene må eksisterer et eller annet sted i systemet, og det er i / bin. Men nesten alt du gjør er kommer til å være fra hjemmekatalogen. Og cd uten noen argumenter overhodet, du kan si cd ~, trenger ikke å. cd kommer til å bringe deg tilbake til hjemmekatalogen. En siste. cd - kommer til å bringe deg tilbake til siste katalog som du var i. Så jeg bare cd'd to ganger på rad, så min forrige katalogen var hjemmekatalogen. Hvis jeg går å kutte bin, og nå la oss gå opp og inn bruker. Bruker aksje. La oss gå til bruker aksje. Nå er jeg nå i brukerdeling. cd -, tilbake i hyllen. Så dette blir spesielt nyttig når du have-- og det vil veksle. Så brukerdeling, tilbake bin, dele bin. Så dette blir nyttig. Du kan finne deg selv å ha mange, mange, mange nestede kataloger. Og du ønsker å gjøre noe virkelig rask i en øvre katalogen. Du går til denne katalogen, gjør endringer og sånt, og nå ønsker du å gå tilbake til der du var. cd -. Jeg er alltid frustrert når jeg måtte gå til at katalogen jeg ønsket å gjøre arbeidet. Jeg får alltid frustrert når jeg gjorde den i to trinn i stedet for ett trinn, fordi det betyr at cd - kommer å bringe inn i den mellomliggende sted i stedet for hvor jeg vil hen. Så vi ser alle listefiler. Vi vet hvordan å komme seg rundt så langt. Så nå la oss snakke om redigering av filer. Så i dette kurset, er du nesten alltid forventet å bruke gedit. Hvis du vil, kan du ta det neste steget og begynne å lære en kommandolinje tekst editor. Så ulike alternativer finnes. Og de som er trolig kommer til å være relevant for deg, vi har Nano, Vim, og Emacs. Så Nano er nybegynnere kommandolinje tekst editor. Så Nano la oss gå på blah.c jeg opprettet tidligere. Det er bare denne standarden C-fil. Og du ser en hel haug med ting skjer ved bunnen av skjermen, og tilsynelatende blah.c inneholder denne C-kode. Så i denne spesielle redaktør, hva det er å si på bottom-- nå dette cirkumflekstegnet symbol, vi ser dette ^ G, ^ X ^ O. Slik at i nesten alle kontekst som du ser, du kan se at caret symbol i andre steder på nettet, på Stack Overflow, noe sånt. Det refererer nesten alltid å kontrollere. Så for å avslutte jeg ønsker å gjøre Kontroll X. Kontroll X, kommer ut. Og jeg kan bruke min pil tastene for å bevege deg rundt. Merker jeg kan ikke peke og klikke lett. Du må bruke pil tastene for å bevege deg rundt. Det kan være en innstilling å peke og klikke. Men la oss gjøre noen endringer. Nå Kontroll X for å gå exit. Det kommer til å si redning endret buffer. Nå teksten, y for ja, n for no. Kontroll C for å avbryte. Jeg vil bare si ja. Filnavnet til å skrive. Standard er filen at det allerede er. Trykk Enter. OK. Nå har jeg nettopp redigert denne filen, lagret det, og det blir endret. Så Nano er den enkleste teksteditor venne seg til. Alternativene er Vim og Emacs. De er høyere nivå tekstredigerings som har en veldig bratt læringskurve. Så min personlige preferanse er Vim. Og den har et bredt utvalg av alternativer. Og når du blir vant til det, vil du aldri ønsker å gå til noen andre tekstredigeringsprogram fordi du bare har så mange ting tilgjengelig for deg i disse, men det tar en virkelig lang tid å lære. Så kanskje du bare ønsker å tvinge selv akkurat nå for å bli vant til det, men jeg vil si det er verdt det. Men det er hardt. Og så Emacs. Jeg har alltid slite i Emacs fordi Jeg vet hvordan du gjør absolutt ingenting. Tilsynelatende Emacs er ikke som standard installert på maskinen. Vi vil nok legge til at som en standardinstallasjoner. Når du lære en av Vim eller Emacs, det er ingen overbevisende grunn til å lære noen gang den andre, men det er en helt annen stil. OK så det er redigering av tekstfiler. PUBLIKUM: Hvis du ble sittende fast i Vim akkurat nå, hvordan we-- ROB Bowden: Det er flere moduser i Vim, og det er hele tutorials på læring Vim. Så hvis du tilfeldigvis være i innsettingsmodus for å skrive inn tekst, som du kan skriv som på ulike måter, men jeg er hvordan du kommer inn i innsettingsmodus. I eller komme seg ut av noen spesiell modus du er i, bare flykte. Og du bare bash Escape for å få ut av eventuelle nestede moduser din i. Bare OK, nå er jeg tilbake i normal modus. Og så i normal modus, et kolon. Du ser det vises nederst. Og så q. Så q vil slutte hvis du har gjort endringer, som I-- har jeg gjort endringer? Jeg har gjort endringer tilsynelatende. Så hvis du har gjort endringer, det vil si at du kan sette et utropstegn. Jeg kommer til å kalle det et smell. Så du kan sette et forbud til bare avslutte uten å gjøre noe, eller kolon wq vil lagre og avslutte. Så w generelt er skrive. Så skrive filen. Jeg kan skrive og sluttet. Eller du kunne bare ha qx slam, q bang bare å komme ut av det uansett om eventuelle endringer som du har gjort. Greit, så la oss nå Vær så god vi kan opprette filer. La oss begynne å fjerne filer. Og jeg vil bare kaste i en rask ny kommando, touch. Så ta på foo. Touch bar. Trykk baz. Hvis jeg ls, nå ser vi at disse filene finnes. De er helt tom. Så touch er bare en enkel måte en, [uhørbart]. To, teknisk sett bare til stat det, oppdaterer den tidsstempler. Så alle andre filer du oppretter har et tidsstempel assosiert med det. Så baz ble opprettet på 14 september på 16:21. Det er nå 16:22, så hvis Jeg berører baz igjen, vi se at baz var mest nylig blitt endret på 16:22. Men ellers jeg nesten aldri se på de tidsstempler på filene. Så touch, her jeg bare bruker den til å lage noen raske filer. All right, så nå rm er den kommando som vi bryr oss om her. Og vi kan rm boo. Si fjerne vanlig tom fil boo. Og vi kan skrive y, og nå er det fjerner. rm baz. Fjern regelmessig tom fil baz og type n for no. Nå er det ikke fjernes. Så bar og baz fortsatt eksisterer. Foo er borte. GABRIEL: Fortsett å snakke. ROB Bowden: Great. Så irriterende melding her, fjern regelmessig empty-- hva gjør du der nede? Fjern regelmessig tom fil. Så hvis vi ikke ønsker å være plaget av denne meldingen, vi kan kaste i denne -f flagg, og så det er kraft. Og nå hvis jeg rm -f, det er ikke til å si det du vil fjerne denne filen. Det vil bare gjøre det. Og ls, ser jeg ikke bar der lenger. Nå som er en potensielt farlig kommando. Det pleier ikke å så ille. Vi vil komme tilbake på et sekund hvordan det kan bli veldig farlig. Og la oss lage litt temp katalogen. mkdir, en annen kommando. Så mkdir er en kommando som gjør en katalog. Og nå ved ls ser vi denne fine lys blå uthevet temp katalogen. Jeg kan cd inn temp. Og jeg kan mkdir foo. cd til foo. mkdir bar. cd i baren. Så vi ser at vi kan enkelt få inn i noen ganske dypt hekkende. Nå hvordan fjerner jeg en katalog? rmdir. Så hvis jeg bare rett prøve å rm, som vi gjorde med en vanlig fil, rm bar kommer til å sier kan ikke fjerne bar. Det er en katalog. Det er en spesiell kommando for fjerne kataloger, liksom. Så rmdir bar. Nå bar er borte. OK, så rmdir jeg ganske mye aldri bruker. Grunnen being-- la oss nå gjøre en vanlig fil bar her. Så rmdir boo. rmdir. Kunne ikke fjerne foo. Katalogen ikke er tom. Så du kan ikke bruke fjerne dir på en katalog som har ting i den. Så har du noen alternativer. Du kan gå inn i den katalogen, fjern alt manuelt, og deretter komme ut og rmdir katalogen. Som åpenbart høres irriterende. Hva om det er tusenvis av filer i det? Vel, du kan rm *. Vi skal snakke om * i et sekund. Det betyr i utgangspunktet alle de tingene. Men enda bedre, så rm -r. Så rm -r-- i mange sammenhenger, betyr -r rekursive, som vi skal snakke om hva rekursive midler i flere uker. Men det betyr i utgangspunktet travers helheten i denne katalogen og fjerne alt. Så rm -r foo kommer til å si ned i katalogen foo? Ja. Fjern regelmessig tom fil foo / bar? Ja. Fjern katalogen foo? Ja. Så nå foo og alt innen den har blitt fjernet. Nå som kan få spesielt irriterende when-- la oss berøre en, trykker du 2, trykker du 3. Kunne ha en hel haug med filer. Hvis jeg ville, kunne jeg lage tusenvis av filer i her. Og rm -r foo kommer å være ganske irriterende. Ja, ja, ja, ja, ja, ja. Med mange flere filer du raskt se hvor mange ganger Jeg måtte skrive ja. Vel, vi bare har sett før hvordan vi kan kvitte seg med å måtte taste inn ja, -f. Så mkdir foo cd foo touch 1 2 3. OK, er så rm -rf foo kommer til å blindt fjerne foo helt. Ingen teksten. Ingen noe. Foo er borte. Så jeg pleier å bruke denne komman hele tiden. Når det er sagt, det er en svært farlig kommando, fordi hvis jeg gjør noe sånt dette, vil det ikke be deg. Det vil bli borte. Og det skjer ganske ofte, og selv i høyere nivå CS kurs. Noen ganger får vi se noe der noen sier jeg tilfeldigvis vår rm rf-ed mitt hjem katalog og alle mine P sett er borte. Og det er ødeleggende, men det er ingen søppelbøtta. Det er ingen det er ingenting for deg å hente. Det er bare borte. Enda verre ville være noe som rm -rf /. Så vi bare diskutert at rotkatalogen. Den har alt av filer på systemet ditt. Ting har en tendens til å bli ganske rotete når du fjerner ting som ls, og cd, og alle disse. PUBLIKUM: Hva er forskjellen mellom rm, rf, og rm * ROB Bowden: Så rm * - ALLISON: Question var hva er Forskjellen mellom rm, rf, og rm *. ROB Bowden: Så rm *. Stjerners generelt middel alle innholdet i denne katalogen. Prøver å tenke på andre måter å vise stjerne. Vel, stjerne faktisk generelt betyr matche ethvert mønster. Så hvis jeg har en fil som heter dog1, røre dog2, berører cat1, berører cat2. Så ls * en kommer til å skrive ut cat1 og dog1, fordi den stjernen kan fylles i with-- det man trenger å være der, men stjerne kan være enten katt eller hund. Det er et wild card. Det er ordet jeg leter etter. Wild card. Eller jeg kunne ls hund *, og Jeg fikk se dog1, dog2. Så de er notering filene som samsvarer med den aktuelle mønsteret. Du kan bruke ls på denne måten. Ls * stjerners samsvarer med alt. Så det kommer til å skrive ut alle innholdet i denne katalogen siden alle av dem passer til. Det kommer ikke til å skrive noe i øvre nivå kataloger. Hvis jeg har en sub-katalog, foo, og berører 1 2 3-- så nå hvis rm * stjerne, fjerne cat1, cat2, dog1, dog2. Kan ikke fjerne foo. Det er en katalog. Så stjerners utvides til alle filene i katalogen. Så teknisk sett rm * er som å si rm cat1, cat2, dog1, dog2, foo. Mens rm -rf, teknisk stjerne ville oppnå det vi ønsker, men rm -rf-- hvis jeg går ut av dette katalog, rm -rf temp, som kommer til å gå inn i temp og rekursivt fjerne alt. Så stjerne er atskilt i at det er forstått by-- så denne tingen at jeg kjører i, denne tingen som ber meg for kommandoer og deretter gjennomføre og gjøre dem, jeg kaller dette skallet mitt. Og så dette skall er i seg selv et program. Og hvis jeg ville, jeg kunne kjøre i / bin / bash. Skallet kalles bash. Og nå merker vi noe er litt endret, og det er fordi mine innstillinger for skallet er noe annerledes. Men nå er jeg teknisk sett kjører et skall innenfor mitt opprinnelige skall, og jeg kan gå ut av skallet, og nå Jeg er tilbake til mitt toppnivå skall. Hensikten med å si som er-- stjernen. Så stjernen er noe forstått av bash. Så rm -rf, er -rf flagg forstått av bare rm. Det vet at når du passere en rf som du vil ha det til rekursivt fjerne alle filer uten å spørre. Stjernen er noe forstått ved bash at når du sier rm *, bash er ikke til å si hei rm *, fjern stjerne. Bash kommer til å si rm * fjerne cat1, cat2, dog1, dog2. Det er automatisk kommer til å utvide alle filene i katalogen. Og på samme måte tilde er en annen symbol som bash forstår. Når du sier cd ~, utvider bash som til hjemmekatalogen. Andre spørsmål så langt? OK, så vi kommer til å begynne å gå raskt. Tab ferdigstillelse. Bare for å kaste den ut der. Mange mennesker gjør ikke realisere dette finnes. Så hvis jeg skriver cd dow, jeg ønsker å gå inn i nedlastinger. Jeg trenger ikke å skrive nloads. Jeg kan bare trykke Tab. Så det anerkjenner at dow er et prefiks som samsvarer ikke noe annet i denne katalogen, så det vil fullføre det for deg. Nå kan jeg gå inn. Jeg også gjøre det rekursivt. Så mkdir foo. La oss gå inn foo. mkdir bar. Så gå tilbake til mitt hjem katalog, kan jeg se nedlastinger. Nå treffer fanen igjen, automatisk kommer til å fylle i foo. Det er den eneste katalogen. Treffer fanen igjen, automatisk kommer til å fylle i baren. Så nå er jeg i (~ Downloads / foo / bar). Så denne kategorien ferdigstillelse, når jeg kom til kontortiden, og jeg står over noens skulder, og de kommer rm D-O-W-N-L-O-A-D-S, jeg er døende. Bare fanen, tab, tab, tab. Så definitivt brukt kategorien. Og tilsvarende opp og ned, mye folk nettopp det som skjedde med aldri har truffet opp og ned. Det kommer til å gå gjennom den forrige kommandoer, så hvis du bare løp noe, og du ønsker å kjøre den på nytt, bare holde opp til du kommer til den. OK. Så hurtig, noen andre ting. La oss gå tilbake til temp. La oss lage noen filer. Så her inne, jeg er bare kommer til å liste noen ord. hund, katt, meow. La oss gjøre hund, fisk. Så nå rep er en veldig nyttige kommandoer som du bruke til å søke gjennom filer for en bestemt tekst, og teknisk kan du gjøre virkelig komplekse uttrykk for det å matche. Så her, hvis jeg grep, og hva ønsker jeg å søke etter? La oss si at jeg søker etter katter, og Jeg ønsker å søke alle disse filene. Så hvordan gjør jeg alle disse filene? Star. Så i filen én, jeg har katt. Jeg kunne sannsynligvis ha kalte det noe bedre, fordi det ser ut som linjenummer eller noe. Men i filen jeg har en linje med katten. I filen to har jeg en linje med katt. Så nå kan jeg se inni filen ett og se oh yeah, gjorde at filen har katt. Notice fil tre var ikke samsvarer fordi katten ikke er der. Jeg kan grep'e for meow. Bare fil to har meow. Så dette kan du kombinere, igjen, med -r, som som jeg sa før ofte betyr rekursiv. Og så jeg kan komme opp her, grep -r for enhver forekomst of-- la oss redigere dette bare å kaste en katt i det. Så grep -r for enhver forekomst av katt hele denne katalogen. Og det vil rekursivt søke eventuelle underkataloger. Så i baz, det er katten. I temp / 2, det er katten. Og i temp / 1 er det katt. Så det er å søke i filer. Nå kan du også bruke en finne. Og så finner er spesifikt om leter etter filer med et gitt navn. Så la oss gjøre litt mer. La oss gå inn nedlastinger. Trykk dog1. Trykk cat2. Trykk cat_dog. Trykk catcat. Så jeg ønsker å finne alle filer med hund i navnet. Så finne, og for den lengste tid jeg aldri husket hvordan finner jobbet, før jeg endelig lese noe som gjorde det så klart. Så finn, automatisk rekursiv. Du trenger ikke å passere en -r. Så finn dot. Vi har ikke snakket om dot ennå. Mens dot dot alltid betyr en katalog opp. Prikk betyr alltid gjeldende katalog. Så jeg kunne rm -r prikk i samme måte som jeg kan rm -rf *. Til syvende og sist de oppnå det samme. rm -rf prikk kommer til å fjerne hele gjeldende katalog. OK, som jeg ikke ønsker å gjøre det. Men finn dot. Så rekursivt søke gjeldende katalog, og nå er alt etter dette er en haug med flagg som du bruke til å utelukke ting fra avkastningen. Så finn dot returnerer alt som det kan finne fra gjeldende katalog. De er alle filene rekursivt søke. Vi får se noen av dem i et sekund. Men i tilfelle du lurer på hvordan jeg gjør det, så Command K, i det minste i min terminal i Mac klarner det. Kontroll L vanligvis klarner det for noen form for terminal. Du kan også skrive klart. Og hvis du noen gang får inn i en merkelig scenario-- det har skjedd med meg et par tid-- hvor fargene dine ledetekster er alle messed opp, eller du ikke er i stand til å se noe blir skrevet når du skriver, fordi noen ganger som bakgrunnsfarge er satt den samme som den Forgrunnsfargen og nå kan du ikke se skriftene. Reset er noe som bare nullstiller du til standard svart bakgrunn, hvit front, eller hva du setter dem til. Så hvor var vi? Finn prikk. Så nå er alt forbi dette punkt begrenser resultatene til noe som samsvarer gitt mønster. Så her jeg ønsker å søke alt med navnet katten. Jeg fikk ingenting. Hvorfor er det slik? Vel, jeg er bare å søke etter noe med nøyaktig navnet katt. Hvis jeg ønsker å søke noe som har noen mønster, og cat-- sitatene teknisk ikke er nødvendig, men jeg kaster dem der. Så nå finner det catcat fordi det er det eneste som har noen vilkårlig mønster fulgt av katt. Jeg kan sette katten *, og nå finne catcat, cat_dog, cat2, fordi de er alle ting med katt i begynnelsen, etterfulgt av hva som helst. Du kan kombinere dette. Hvis du ønsker å søke etter alle C-filer som du har, kan du gjøre * .c. Vi har blah.c her. Så det er en finner fungerer. Du kan søke. Den har en hel haug med flagg for ytterligere restriksjoner. Og en på dem, la oss si -d. Så foreldet. Å, det er ikke det jeg ønsker. Ikke -d. Type d. Så finn dot - typen d. Så hva som nettopp gjorde er jeg søker for alle filer i gjeldende katalog med a-- d står for directory-- katalog type. Dette setter alle kataloger i gjeldende katalog. Og type F er alt vanlig filer, alle ikke kataloger. Så det er bare en eksempel på andre måter du kan begrense den andre søk enn bare navnet på filen. Det har vært 30 minutter. Still going. ALLISON: Jeg skal bris gjennom. Det blir bra. ROB Bowden: Så noen andre ting. Nå bang, utropstegn. Så det generelt means-- vel, la oss se et eksempel. Så f!, Hva som kommer til å gjøre? Vel det ser ut til å ha gjentatte funn dot -type f. Hva om! G? Som bare grep -r katt *. Så bang du kan bruke til å gjenta en nylig utført kommando. Så hvis jeg skriver! Gre, det kommer til å re-run kommandoene som begynte med gre mest nylig. Og du kan se alle disse kommandoer med historie. Så historie. Disse er alle kommandoer jeg har kjørt i dag. Og vel, det er ikke bokstavelig talt begrenset til i dag, men jeg har bare brukt dette apparatet som i dag. Det er din helheten av historien din bash shell, bortsett fra det kutt av på et tidspunkt. PUBLIKUM: Hva skjer hvis du gjør historie [uhørbart] kommando og en feil i resultatet vil fortsatt skrive ut the-- ROB Bowden: Ja, hvis det er en feil i en av disse commands-- så la oss si, er at en error kommandoen ikke funnet. Fortsatt vises i historien. OK. Andre spørsmål om noe? Så det er bang. Nå, virkelig nyttig kommando, mann. Slik som gir deg den manual for en gitt kommando. Så la oss si man ls, så Dette viser meg ls. Det viser katalogen innholdet. Og det er her jeg ser at det er disse forskjellige flagg som eksisterer. Så vi ser at ls -l finnes hvis vi skulle lese det. ls -l gir meg denne fullstendig oversikt over de katalog med hvem som eier filen, størrelsen på filen, den modifiserte tidsstempel. Så ls -a er en annen som du kanskje faktisk bruke litt ofte. -Al er min vanligste flagg denne siste ls. Så -a, merker det er mye flere filer enn bare ls. ls -a. Hva er felles med alle disse filene? De starter med en prikk. Så dette er en konvensjon i Linux som filer som begynner med en prikk er skjult. Så det betyr bare at når vi bare rette ls, eller vi leter etter denne katalogen ved hjelp finneren tilsvarende, eller Windows Explorer tilsvarende, at vi ønsker ikke å se disse dot-filer. De bare forurenser syn på ting. Så de er skjult med mindre du spesifikt be dem med noe sånt som -a. Så jeg kan cd inn .local, og jeg ser at det er i seg selv en katalog med en felles katalog, og applikasjoner, og blah blah blah. Så prikk, filer de er bare skjult. OK, så andre viktige. Jeg har et par jeg kan hoppe over. La oss bare virkelig rask snakk om filutskriftsvalgene omdirigering ting. Så det er et helt kompleks serie ting du kan gjøre med disse, men bare for å se dem, la oss si, ekko. En annen kommando. Virkelig dum kommando. Alt den gjør er å skrive ut hva jeg forteller det til. Så ekko hei. Det bare ekko hei til skjermen. Hei verden. Echoes hello world. Så en kommando eller en symbol som bash forstår Dette større enn symbol, og som er det utgang til en fil symbol. Så hvis jeg utgang dette til foo, det er nå en fil kalt foo, innsiden av som er hello world. Så merker at når jeg ekko hello world rør inn foo, det gjorde ikke ekko hello world. I stedet ble det satt i filen foo. Og en annen kommando bare å kaste den på deg, katten. Det er en enkel måte å bare helt vise innholdet i filen slik at jeg ikke trenger å åpne en tekst editor for å kunne se den. Slik at innholdet av foo filen er hello world. Og jeg kunne cat blah.c, innholdet er dette. Igjen, dette er kommandoer som, ikke gjør det forventer at du har dem alle i minnet. Ideen er at du har sett dem. Kanskje du jobber med noe, og du er som jeg er lei av å åpne denne filen. Jeg skulle ønske jeg kunne bare se på innholdet virkelig rask. Du kan gjøre det, så se tilbake og si oh jeg husker noe sånt som eksisterer, og det er katten. Så det kommer til en fil. Nå er det egentlig ikke noe bra eksempel på å lese fra en fil ennå. Hva er noe som tar noe fra standard i? Noen enkel Linux-kommando? Når vi kommer til den, i et par uker alle de piece-- godt, denne uken har du et stykke der du begynne å ta input fra brukeren. Og så vanligvis du skriver som innspill ved tastaturet. I stedet for å skrive at innspill på tastaturet, du kan i stedet pipe i fra en fil slik at når du gjør Mario, ./mario, røret inn fra en hvilken som helst gitt fil, og som kommer til å kjøre mario programmet. Ikke ventet inngang på tastaturet, i stedet er det bare kommer til å lese linjer fra foo fil. Så større enn foo setter den inn foo-filen, og mindre enn foo tar ting fra foo filen og bruker det som innspill til dette programmet. Og bare for å se det, kunne vi også ekko foo bar baz, og da i stedet for en større enn, la oss gjøre to til foo. Hva gjør det gjøre? Det legger bare til filen. Så i stedet merke hvis jeg ekko blah inn foo og deretter katt foo, det er bare blah. Så når du utgang til en fil, det helt overskriver den filen. Hvis du bare ønsker å legge til, double [? klassing. ?] Og sist er rør. Pipe Gets mye mer komplisert, der det tar for utgangssignalet fra en kommando og mater den inn neste kommando. Så noen felles ting, historie. Så, ugh, jeg ønsker ikke å se på dette. Vis meg alle kommandoer i min historie hvor jeg grep'e-ed for noe. Nei, det er forvirrende. Vis meg alle kommandoer hvor finner jeg. Alle finne kommandoer jeg noensinne kjørte. Så historie. Nå historie utganger til skjerme denne listen over kommandoer, men jeg ønsker ikke å utgang den til skjermen. I stedet kommer jeg til å rør den inn grep. Så la oss grep for alle forekomster av funn. Så nå i stedet for grep taking input, i stedet of-- grep er i stand til å håndtere så input-- vi er ved hjelp av grep litt annerledes her. Så i stedet for å skrive en liste over ting vi ønsket å søke etter og sa grep tar som input. Så hvis jeg bare grep finne, det venter for meg å skrive ting. Så katten hallo finne. Hei. Finn. Legg merke til hver gang jeg skriver finner den anerkjenner at jeg skrev finne. Så i stedet for dette, vil Søk Filer for funn. Så historien er nå kommer til å ut en liste over alle kommandoer. Vi setter som utgang, og vi mater den til grep, og så er det spytter ut alle forekomster av funn. Grunnen til at jeg sa det ville være forvirrende er hvis I-- det er fortsatt forvirrende. Hvis jeg grep for grep. Legg merke til det er stort sett alltid viser kommandoen jeg bare løp fordi den kommandoen selv har grep på innsiden av det. OK, så noen spørsmål om noe? Og jeg skal overføre det over på dette punktet. Forhåpentligvis er dette en fin oversikt over alle kommandoer at du ikke trenger å ha utenat, men disse utgjør et faststoff 95% av hva jeg gjøre på kommandolinjen. Også huske på at kommandolinjen seg selv, er bash et programmeringsspråk, og så når du kommer ned til det, du kanskje ønsker å gjøre virkelig kompliserte ting. Og så det har ting som looper, og IFS, og alle de at du kommer til å bli vant til med programmeringsspråk. Men det er utenfor omfanget av denne delen. OK, så ingen spørsmål? ALLISON: Ingen? GABRIEL: Skal du to-- ALLISON: Jeg kan gjøre det på min hvis du vil. Vi kan se hva som skjer. ROB Bowden: Off to Allison. ALLISON: Woo. Du er en vanskelig å følge, Rob. Ønsker du meg å bytte med deg? Eller du fikk, OK. Jeg kommer til å prøve og ikke ganske være så lang der. La oss se om dette vil fungere slik jeg vil ha det til. Kanskje? Haha! Ja. Så jeg skal bare veldig raskt gå gjennom variabler, løkker, conditionals, og litt på kompilatoren. Hvis du har spørsmål i enhver tid, kan du stoppe meg. Disse gutta vil minne meg om å gjenta spørsmålet ditt i tilfelle jeg glemmer, men bør ikke være så ille. Så variabler, ja. Vi har ingen av dine Skrape stykker her. Jeg er sikker på at de fleste av dere, hvis du hadde noen form for spill som du opprettet med Scratch, hadde du å holde styr på noe sånt score, eller tid, eller noe sånt. Så de lyse oransje stykker som vi ser det er bare Scratch form av variabler, og du vil definitivt være med variabler gjennom programmene dine. Hvis du ikke, jeg er egentlig ikke sikker på hva du gjør. Men uansett, store ting, definere variabler. Med C hver variabel har å ha en type erklært, så jeg ga deg en veldig generelt en på toppen. Så vil du ha din skriver og deretter hva du bestemmer deg for å ringe til variabel. Så i dette tilfellet, skriver i variabellisten. Vi har tre eksempler. Char av noen klasse, av en A, som er hva Jeg er sikker på at dere alle vil ha å få i denne klassen. Du kan definere flere variabler på én linje så lenge de er av samme type, som er vår andre eksemplet er det der du har tre variabler, x, y og z. De er alle flyter. Og så kan du også, i denne siste eksempel med int poengsum og antall lag, kan du initial dem rett der. Så i midten eksempel der vi bare ha flyte av x, y og z, de blir ikke nullstilt ennå. De har ingen verdi. Eller de har søppel verdier. Og hvis du prøver og bruke dem, kompilatoren vil kjefte på deg. Du må både erklære og initial variabler. Så i dette siste, vi gjør begge deler. Vi er erklære variabler av score og antall lag, og vi er initial dem, gi dem deres initielle verdier av 7 og 4 hhv. Cool. Alle gode? Awesome. OK, så noen konvensjoner. Hvis dere har lest gjennom style 50, disse er bare ting som vi ønsker for du kan implementere i din stil. Så meningsfulle navn. Hvis du begynne å kalle ting bare x, y, og z, særlig som du kommer inn omstendelig programmer, er du sannsynligvis kommer til å forvirre deg selv og være som hva er denne variabelen refererer til. Jeg aner ikke hva dette betyr. Så hvis det er ment for å holde en score, kall det score. Hvis det er ment å holde noen svar eller resultat, gi det et navn som det. For looper, som vi vil komme inn i neste lysbilde, enkelt brev variabler er fine. ROB Bowden: I, j og k er bare konvensjoner for etter looper at alle forventer dem å bli kalt i, j, og k. Du kan ringe them-- jeg ser rad kolonne eller rad samtale noen ganger for to nestede løkker, og det er også slags standard. Men i og j er helt forstått. ALLISON: Ja, jeg og j du er helt fine. For ordens skyld som i noen av dine P-apparater, det kan være fornuftig å ha mer beskrivende ting der bare å holde styr på det. Men jeg tror i, j og k jeg tror de aller fleste av oss all bruk. ROB Bowden: Med disse konvensjoner, slik stil er viktig. Det er en av de fire akser der du gradert, og det er så lett å bare gå over P satt på slutten og sørg at det ikke er stilistiske feil. Så sørg for at du tabbe riktig. Sørg for at variablene er navngitt. Legg igjen noen kommentarer. Det er veldig lett å få disse punktene. Du trenger ikke å tenke på noe for å få disse punktene. Du trenger ikke å finne noe ut. Det er bare slik at det ser pen. ALLISON: Faktisk har vi har style 50, som vil fortelle deg hvor du får opp hvis du får opp på stil og vil fortelle deg nøyaktig hva du trenger å fikse, og hvordan du trenger for å fikse det. Det er også bare bra å nevne at det er kurspolitikk at hvis du er på kontoret timer og koden din er et rot, Vi kan avslå å hjelpe du til det ser finere. Så starter ut til høyre, holde konsekvent stil, du også bare kommer til å gjøre livet mye enklere når du prøver å gå gjennom feilsøke. Hvis du prøver å finne ut der du mangler en klammeparentes og de er over alt, du er bare å lage ditt eget liv vanskeligere. Så vær konsekvent med stil. Jeg lover det vil gjøre livet ditt enklere. Det vil gjøre livet enklere. Alle vil bli mye lykkeligere. Og det er det du ønsker. GABRIEL: Din karakter vil bli høyere. ALLISON: Ja, og din klasse. Hvis TF er som deg, har en tendens til å være gunstig. All right, og så bare det andre punktet her. Konsistente initializations. Så som vi så, kan du erklære og initial ting. Flere variabler på samme linje. En ting vi ønsker deg ikke å gjøre er å erklære noen variabler og ikke initial dem på samme linje som du initialisering andre. Så i tilfelle som gjorde ingen mening overhodet, Vi har eksempel her hvor vi erklære ints i variabler av kvartalene dimes og pennies, men kvartalene og pennies har ingen innledende verdi. Vi har ikke initialisert dem, men midt i det vi allerede initialisert dimes til 0. Så enten gjøre kvartalene, dimes, pennies. Eller gjør kvartalene lik 0. Dimes lik 0. Pennies lik 0, eller hva de opprinnelige verdiene er. Store ting med stil, være konsekvent. Når du er i tvil, må du være konsekvent. Men følg vår stil guide også. Cool. Alle bra det? PUBLIKUM: Hvor er stilguide? ALLISON: Stilen guide er on-- hva er nettsiden? GABRIEL: Jeg tror det er manual.cs50.net/-- ALLISON: Style? GABRIEL: Style. Jepp. ALLISON: Ja. Så spørsmålet, hvor er stilen 50. manual.cs50.net/style. Ja? PUBLIKUM: Hvis vi definerer variabler, er det OK hvis vi legger ut [uhørbart] liker int score og deretter int mål. Så vil du si at nå har vi fikk til å definere dem sammen? ALLISON: Så spørsmålet, bør du har overflødig kode når du definerer variabler som int score og på neste linje int spillet? ROB Bowden: Det er definitivt tilfeller der overflødig kode er dårlig. Jeg ville ikke vurdere som overflødig kode. Jeg nesten aldri erklære flere variabler på samme linje noensinne. Og hvis noe, er det fordi vanligvis jeg forlater en slags kommentar forklare hva variabelen er for. Så jeg vil si int poengsum slash slash. Holder styr på hva som helst. Totalt slash slash. Så det er mye grovere på den måten å sette dem alle på samme linje. Jeg har bare aldri satt dem på samme linje. ALLISON: Jeg føler at det er personlige preferanser på dette punktet. PUBLIKUM: Betyr det gå for etter looper og sånt også? ROB Bowden: Som inni? Som int i lik 0 komma Lengden tilsvarer noe? At du ikke har et valg. Med for løkker initialisering part-- så kanskje du bare har sett int i lik 0 semikolon i mindre enn hva semikolon i pluss pluss. At int i er lik 0, teknisk kan du også gjøre hva vi så før med komma syntaks. int i lik 0 komma j tilsvarer tre komma k lik 5. Du har ikke et valg for å splitte det opp i flere linjer, og det er standard. Å se det der er greit. ALLISON: Awesome. Vel, praktisk naturlig overgang til sløyfer. Så ja, her har vi noen eksempler av løkker som dere så i Scratch. Og selvfølgelig alle disse kan bare bli gjenskapt i C. Og de i utgangspunktet tillate deg å gjenta noen del av koden inntil en bestemt betingelse er oppfylt, noe som vi vil komme inn i retten etter å ha snakket om looper med conditionals. Så vi har tre hovedtyper. For, mens, og gjøre mens, som vi vil alle gå gjennom akkurat nå. Så første er for sløyfer. Så for noen tilstand, utføre denne blokken med kode. Vi har denne kule liten diagram her nederst. Men i utgangspunktet har du i din for at første linje, du kommer til å initial variabler. Så som vi snakket om, er jeg lik 0 eller I er lik 10. Uansett hva du trenger det variabel for å være det er kommer til å bli initialisert der, deklarert og initialisert til en viss verdi. Så da har vi noen tilstand som kommer å være sjekke vår variable mot noe. Slik at i tilfelle det typiske tilfellet der kanskje du vil at denne delen av koden å utføre fem ganger. Slik vi ville ha int i er lik 0, og vi vil den skal være når jeg er mindre enn fem. Slik at tilstanden er bare kommer til å sjekke at hver gang. Hvis denne betingelsen evalueres til sant, er det kommer til å kjøre koden, som er nøyaktig hva denne lille diagrammet viser. Og så det utfører det. Den oppdaterer en variabel, som er det vi ser i siste del av vår for sløyfe initialisering der. Så det vil bare fortsette å gjøre dette til at vilkåret ikke er oppfylt, og da vil det gå ut sløyfen og fortsette går videre med resten av programmet. Alle bra det? Cool. Så her er et eksempel, veldig lik til noe jeg nettopp har snakket om. Så vi bare ønsker å skrive ut dette er CS50 10 ganger. Så du ser her har vi vår for, og da er vi initialisere variable Jeg skal være lik 0. Vår tilstand er sjekket at det er mindre enn 10. Så vurdere å true når vi først starte, og oppdaterer deretter vår variabel hver gang at det faktisk utfører og skriver ut dette er CS50. Og vil opphøre etter 10 ganger. Cool. Så mens sløyfer er opp neste. Og som du ser her, vi må bare noen mens dette condition-- spørsmålet? PUBLIKUM: Hvordan kan jeg hoppe faktisk bare ikke ett nummer, men to tall [uhørbart] Jeg pluss pluss pluss? ALLISON: Så spørsmålet var hvordan kan du oppdatere variabel med mer enn én på en gang. Så jeg pluss pluss vil oppdatering av en hver tid. Hvis du ønsket å oppdatere den ved to, kan du gjøre i pluss er lik to. ROB Bowden: Har du sett pluss lik i forelesning ennå? PUBLIKUM: [uhørlig]. ALLISON: Det er effektivt samme som jeg lik jeg pluss to. Så det kommer til å ta det, og oppdatere den ved to hver gang. Plus er lik er bare noe vi kaller syntaktisk sukker. ROB Bowden: Ja, de finnes for ganske mye alle aritmetiske operatører. Så jeg alltid lik ville doble antallet. j skillet er lik 3 er den samme som j er lik j delt på tre. ALLISON: Eller minus er lik to ville dekrementere I ved to hver gang. ROB Bowden: Selv mod lik. Du har ikke sett bitvis operatører, men cirkumflekstegnet lik og-tegn er lik, alle de eksisterer. ALLISON: Så mange ganger, spesielt med ditt første par P-apparater, du vil bli trolig økes ved en, så jeg pluss pluss, j pluss pluss er alle ting du skal typisk å være bruker. Men den oppdateringen tilstanden er fullt innenfor din kontroll. Du kan oppdatere den uansett med hvilke intervaller eller på den måten du bestemmer deg for. Kanskje du vil den skal være et tilfeldig tall noen ganger. Men ja, det er mange ting du kan gjøre med det. Du er ikke begrenset til jeg pluss pluss. ROB Bowden: Bare så du vet den finnes, det også eksisterer i en annen form, pluss pluss jeg. Så hvis du noen gang søker på nettet og tilfeldigvis se pluss pluss jeg, ganske mye betyr det samme. ALLISON: Cool. Bra? Awesome. Så mens sløyfer. Svært like. Du har noen tilstand. Det viktigste å legge merke til her er i stedet for å måtte tre forskjellige deler å sette opp, har vi en. Vi har bare noen tilstand som blir kontrollert. Og på samme måte, så lenge at betingelsen har verdien true, koden din kommer til å kjøre. Og hvis det er usant, det opphører, flytte til neste del av programmet. Så dette er slags like-- hva som er et godt eksempel på å sjekke for noen normal tilstand? GABRIEL: Mens sant. ALLISON: Du kan gjøre mens sant. Vel, er en lik 1. ROB Bowden: Du kan gjøre while-- bare i stedet for ved hjelp av en løkke for, du kan alltid kode en for loop på en stund loop, så jeg større enn 0 eller mens jeg er mindre enn 10. ALLISON: Awesome. Og da har vi gjøre mens looper, som er stor for bruker validering, der Ønsker du å få noe fra din bruker, se om det er gyldig, og deretter fortsette derfra. Så en av de tingene å vite er med en gjøre mens er at det kommer til å utføre, og deretter vil det re-utføre Hvis denne betingelsen er oppfylt. Så sannsynligvis den beste måten å gjøre dette er bare for å se et eksempel her. Så som jeg nettopp nevnte, bruker validering er virkelig useful-- eller gjøre Mellem er virkelig nyttig med brukervalidering. Så dette er bare kommer å re-spørre noen bruker før de går inn i et positivt tall, som kan være nyttig for din P sett denne uken. Og så i dette tilfelle, når vi utgangspunktet kjøre dette programmet, det kommer til å skrive ut angi et positivt tall. Det kommer til å få noen input fra brukeren, og så kommer det til å sjekke at innspill mot tilstanden at du har satt for det. Så i dette tilfellet kommer det til å sjekke. Det kommer til å si, OK, er vårt innspill negativ, eller det er 0 eller negativ, som vil være ugyldig. Så da ville re-prompt. Spørsmål? PUBLIKUM: Er dette den samme da som en mens loop hvis du bare kopiert koden og sette den [uhørbart] mens loop? ALLISON: Så spørsmålet var ville dette være den samme som nettopp en stund sløyfe hvis vi skulle bare kopiere mens loop over. Så i dette tilfellet, er din mens loop kommer til å sjekke tilstanden først. Slik at i dette tilfellet, hvis vi forsøkt å skrive så bare en stund loop, det vil si mens -inngangen er mindre enn en. Men vi ikke har en inngang for det. PUBLIKUM: Hvis du [uhørbart] mens loop inkludert denne koden, men da du taklet koden over mens loop også. Du hadde bare denne koden [Uhørbart] mens loop. ALLISON: Det ville være det samme, ja. Så du kan bare write-- stedet for å ha en do-- ja. GABRIEL: Men det er mer elegant. ALLISON: Ja, det er mer elegant. Du kan komme inn i design og whatnot, men ja, du kan helt gjøre det. Eventuelle andre spørsmål? OK, kult. Så vi har snakket mye om forholdene med alle disse løkkene som vi har, slik at vi faktisk får inn forholdene i boolske uttrykk. Igjen, bruker du disse i C, så bare slags overgang fra mer grafisk grensesnitt å faktisk koding. Cool, så stor en, hvis. I utgangspunktet bare tillater oss å introdusere noen logikk i vårt program og sjekk sys forhold. Så i dette tilfellet, OK, er n større enn 0? Ja, det er, slik at du kan utføre dette. Det er bare å sjekke litt betingelse at du har satt, som jeg tror vi alle komfortabel med å sjekke forholdene. Cool. Så hvis annet er den andre en, du kan si OK, hvis dette er sant, gjøre dette først. Ellers vil jeg du skal standard og gjøre noe annet. Som i dette tilfellet, du enten velge en positivt tall eller et negativt tall. Du har bare to alternativer. Du trenger det for å utføre uansett av hva brukerinnganger. Så du kan si vel, Er dette tall større enn 0? Cool. Skriv ut et positivt tall. Hvis det ikke er det, skriver du ut en negativ. Alle gode? Og så en ting til å gjenkjenne er at dersom dersom betingelsen er oppfylt, den andre vil aldri også utføre. Bare én av disse vil utføre på en gang. Så det er en trade off. Du får ikke til å ha begge deler. Du har enten den første betingelsen. Du har enten if eller annet, ikke begge deler. Som deretter kan gjøre ting enda mer komplisert, fordi du kan gjøre hvis, annet det, og deretter annet. Så i dette tilfelle vi har tre forhold. Og igjen, er bare én av disse kommer til å ende opp med å bli henrettet. Så du kanskje lurer på vel, hva om du har noe som kan møte to av disse. Kanskje uansett hva du taster inn møter både tilstanden for hvis og annet hvis. Eneste som kommer til å kjøre ALLISON: Så snart den finner noe at det oppfyller betingelsen for at evalueres til sant, det er det det kommer til å kjøre og ingenting annet. Så hvis du hadde dette nummeret mellom 0 og 5 for din første, eller er dette tall mellom 3 og 5 for den andre hvis en del, og du innspill number-- Jeg sa 0 og 5 og-- 4. Det kommer til å treffe den første. Det kommer til å si OK, dette nummer ligger mellom 0 og 5. Gjennomføre og forlate. Det vil aldri treffe det andre alternativet. Cool? Awesome. OK vi har også bryter uttalelser hvis Ønsker du å få enda mer-- eller sorry, bryteren er neste. Jeg får foran meg selv her. Igjen, flere hvis blokker der som jeg nettopp sa er så snart du finner en betingelse som er oppfylt og en if else if annet, det etterlater. Hvis du trenger å sjekke flere ting, du er kommer til å ønske å bruke dette fordi det vil sjekke hver gang her. Så dette vil gå gjennom, og hvis den er større enn eller lik 90, det kommer til å skrive det. Og det vil kjøre gjennom og sjekke hver eneste en av disse. PUBLIKUM: Så dette ville være mer buggy enn [uhørbart]. Vil dette være som [uhørbart]? ALLISON: Spørsmålet er ville dette være buggy eller gjør dette gjøre hva du vil. Det er egentlig avhengig av hva du ønsker fra programmet. PUBLIKUM: Jeg mener som hvis du setter 90 i. ALLISON: Hvis du putter 90-- PUBLIKUM: [uhørlig]. GABRIEL: Du kommer til å få to ting. ALLISON: Du kommer til å få to ting. Ja, to. ROB Bowden: Two? ALLISON: Nei. ROB Bowden: Four. Hvis du putter 90, kommer det til å si at du fikk en A, du fikk en B, du fikk en C, du fikk en D. PUBLIKUM: [uhørlig]. ALLISON: Høyre. Så jeg er avhengig av hva du ønsker fra deg program. Noen ganger må du sjekke flere ting. Du får mye dypere inn i hva god design er som du går fremover. Det er viktig å vet er at dette vil sjekke alle fire forholdene her. Mens hvis dette var en if else if annet Hvis annet, ville det rammet det første tilfellet, det ville skrive du fikk en A og gjøres. ROB Bowden: Selv om vi besluttet å endre dette til hvis og større enn eller lik 90, hvis og større enn eller lik til 80, og mindre enn eller lik 89, dersom n er større enn eller lik 70, og n er mindre enn eller lik 79, slik at det vil være korrekt. Som vil gjøre hva vi vil, men det fortsatt sjekker hver enkelt det. Så mens det i den første scenario, hvis vi inn 90 med bare hvis annet hvis annet hvis, og vi går inn i 90, da det kommer til å korrigere. Det vil sjekke først en, print du fikk en A, hoppe over alt, fordi det allerede funnet en som fungerer. Alle saker er gjensidig utelukkende basert på hvis annet hvis annet hvis. Så det vil utføre først hvis, så er det gjort. Det vil gå til slutten. Mens hvis vi endrer dette er hva jeg var si med mindre enn eller lik 89. Det kommer til å sjekke den første. Det vil skrive ut. Det skal sjekke den andre. Det kommer ikke til å skrive ut. Sjekk den tredje. Ikke kommer til å skrive ut. Sjekk den fjerde. Nå kommer til å skrive ut. Så i så fall den andre hvis versjon, siden disse sakene er gjensidig utelukkende, er det bedre bruk hvis annet hvis annet hvis, fordi det kommer til å ha færre kontroller av forholdene enn denne versjonen. ALLISON: Awesome. Så en annen ting vi kan gjøre er bryter uttalelser. I utgangspunktet en bryter uttalelse tar i noen variable, i dette tilfellet er det n og bestemmer hvilken sak å gjennomføre. Så dette er også en der dine saker bør være slags gjensidig utelukkende. Så i dette tilfelle, hvis vi at vi får en, er det kommer til å matche hva som variable-- uansett verdien av n er i ett av disse tilfeller, slik at en, to, eller 3, og skrive ut den tilsvarende linjen. Og så hvis du merker her, vi har også en standard som du kan av å tenke på som annet. Så hvis du velger et annet nummer foruten 1, 2 og 3 i dette tilfellet det bare kommer til å skrive ut ugyldig. Bestemme når man skal bruke ifs versus hvis andens versus brytere kommer å være noe som dere vil se designe klok som du begynner å skrive mer kompliserte programmer, og det er ingen harde og raske regler om når du skal bruke dem. Det er egentlig avhengig av konteksten. ROB Bowden: Og bare å kaste det der ute siden det er mer behagelig delen. Brytere, har de en tendens til å be-- så du er begrenset i antall måter du kan bruke dem, fordi IFS, tilstanden kan være ganske sett alt du vil. Med brytere sakene må være tall, eller teknisk de kan være tegn, men chars, som vi skal se, er bare tall. Så de må være tall, men brytere virkelig er mer effektiv enn hvis else if annet hvis, fordi selv ta eksempelet before-- godt, eksempelet karakteren virker bra. Vel la oss si her, vi i stedet gjøre dette som en if else if else if scenario. Slik at hvis n er lik lik 1, skriver du plukket et lavt tall. Dersom annet hvis n er lik lik 2, du plukket en medium nummer. Else om likeverdige er lik 3, høy. Else ugyldig. Så la oss si det var vårt scenario. Så la oss si vi går inn 4, så vi forventer ugyldig. Måten at hvis annet hvis annet hvis tilnærming kommer til å fungere er kontrollerer den første tilstand. Det er ikke fornøyd. Så vi sjekke den andre betingelsen. Det er ikke fornøyd. Sjekk det tredje vilkåret. Ikke fornøyd. Så vi går til andre og skrive ugyldig. Måten bryter verk er det kompilerer ned inn i hva vi skal å kalle et hopp bord. Hovedsaken var at når du skriver inn 4, Det kan umiddelbart gå til standard. Det trenger ikke å sjekke am I tilfelle en? Nope det er det ikke. Tilfelle 2? Nope. Sak 3? Nope. Standard. OK, dette må være der jeg ønsker, og deretter utføre det. Nei, det umiddelbart hopper til standard. Eller det jeg skriver 2, er det umiddelbart kommer til å gå til to uten å måtte gå gjennom en sak. Så på den måten, realistisk i dag som er ikke så mye av en effektivitetsgevinst. Vanligvis datamaskiner er ganske fort, og det er ikke så stor. Men det er tilfelle at brytere er raskere. Hvis du virkelig prøver å optimalisere, bruke en switch. ALLISON: Cool. Og så har vi trefoldig operatør. Så jeg vet jeg nevnte tidligere ordet syntaktisk sukker. Så det er bare ting som gjør koden mye mer konsis. Så dette er en av disse sakene. Så trefoldig operatøren er spørsmålstegn kolon som vi ser i linje streng s n er lik større enn 100 spørsmålstegn høy kolon lav. Så i utgangspunktet hvordan dette fungerer er det er n er større enn 100 er en betingelse. Så jeg tror det kan være fornuftig. Det er som å spørre et spørsmål. Det er å si oh, er n større enn 100. Hvem vet? Og hvis det evalueres til sant, det kommer til å gi deg det første som er oppført der, som er høy. Ellers kommer det til å gi deg lavt. Så dette er bare en veldig enkel og effektiv måte å gjøre som en if annet. Det er alt dette er. Og hvis vi skulle skrive denne som en if annet betinget, det ville være hvis n er større enn 100, returnerer høy. Else, returnere lav. Dette er bare en mye mer konsis måte å skrive det. ROB Bowden: Så dette eksempelet er når du gjør noe som dette, er dette mønsteret hvor jeg bruker trefoldig veldig ofte. Så vi har ikke snakket om omfanget ennå, men jeg hater å se streng s semikolon. Hvis n er større enn 100, s lik høy. Else, er lik s lav. Så dette mønsteret, de fem linjer av koden bokstavelig talt 100% av tiden kan overføres inn i hva var oppe med en trefoldig. Slik at det ternære, en kodelinje. If annet, fem. Det er et eksempel jeg peker ut hver eneste gang. Dette ville flott sted for en trefoldig operatør. Det er så rent. Men folk har en tendens til å aldri bruke det. ALLISON: Ta det bort Gabe. GABRIEL: Så nå dere alle lærte på forelesning denne uken at alt i en Datamaskinen er binært, ikke sant? Akkurat som lampene her. Du kan enten slås av og på. Og etter alt, mener jeg bokstavelig talt alt. Noen tall og tegn og strenger, og selv koden som du skriver når det blir kompilert til maskin kode og sånt, så det hele koker ned til 0 og 1 '. Og så når vi har å gjøre med heltall, som er noe som er teknisk veldig enkel, bør vi være i stand til å gjøre ting som å legge dem, som er trolig en av de enkleste tingene du kan gjøre for å to heltall, ikke sant? Så addisjon og subtraksjon fungerer akkurat som det fungerer i titallssystemet, bortsett fra her er det binære, ikke sant? Så det er i bunnen to. Så legge en pluss en. Som gir 0, og en bærer over. Og bare fortsette å gjøre det, så nå kommer det mer interessant spørsmål. Vi vet hvordan de skal representere alle positive heltall i datamaskinen, men la oss gjøre dette til en øvelse. Lat som dere er alle i 1960 eller noe forsøk på å opprette en datamaskin, og du må komme opp av en måte å lagre minus 1, for eksempel, eller en hvilken som helst minus heltall for den saks skyld. Hvordan vil du gjøre det? Noen ideer? Bare kaste noe på meg. Ja? PUBLIKUM: [uhørlig] utpeke en spesiell hvis [uhørbart]. GABRIEL: Du kan utpeke en spesiell bit, som vil være 0 eller 1. La oss si at en hvis det er positivt og 0 hvis den er negativ. Og deretter resten av borkronen er bare å lagre nummeret. Cool. Så det er en veldig god idé. Vi har, jeg vet ikke, 200. Og hvis den første biten er slått på, så er det pluss 200. Hvis det er slått av, er det minus 200. Cool. Det er bare én liten Problemet med dette, som er hvis vi prøver å summere opp ting. Så forestille vi har 11111 her, og vi summere dette med 00100 uansett. Hvis disse to er positive, er det helt greit. Men så hvis en av dem er negativ, i likhet la oss si at denne biten her er den som er ansvarlig for-- Jeg kommer til å gjøre en separate-- så dette betyr at dette tallet her er positiv. Dette betyr at denne tall her er negativ, ikke sant? Men så når du er kommer til å summere dem, du trenger en hvis setningen sier oh hvis dette er 0, så mitt summen vil være noe annet, ikke sant? Så det er en litt mer smart måte å gjøre at, som kalles to-komplement. Så i utgangspunktet det vi gjøre er vi definerer minus 1 å være tingen at hvis Vi legger opp til en gir oss 0. La meg gjenta det. Så la oss si at dette her er 1. Hva er det som naturlig i positive heltall lagt til som gir oss 0? Hva om vi prøver å legge den til dette nummeret? Vi kommer til å have-- OK, så la oss legge til. Vi kommer til å ha en pluss en er 0, og deretter bærer det over. Og så kommer vi til å få 0 igjen. Jeg blir forvirret. Og du kommer til å få 0 og 0 og 0 og 0 og 0 og 0. Massevis av 0-tallet. I det siste, er vi ikke kommer til å være i stand til å bære det over, fordi la oss si at vi bare håndtere med én byte, så bare 8 bits. Så hva maskinen gjør som standard er bare glemmer om at [uhørbart], OK? Så dette er det som kalles komplementet for to. Vi definerer rett og slett minus 1 å være ting her at hvis du legge det til en vil gi deg 0. Og det er ganske kult fordi vi ikke egentlig trenger sent å implementere en annen type sum avhengig av om det er en negativt eller et positivt tall. Betyr det fornuftig? Så en ting som vi gjør her for å omdanne mellom en positiv og en negativ heltall er da vi kaster alt, og da vi legge 1 til det nummeret. Hvis du prøver å gjøre det selv på et stykke papir, du kommer til å se at er fornuftig. Men hvis jeg tar dette nummeret her, dette er fem. Så hvis jeg snur alt her, så 1, 1, 1, 1, 1. Flip, flip, flip. Og så jeg legger en til det. Jeg kommer til å ha nøyaktig minus fem. OK? Dette gjør slags følelse fordi hvis du prøver å oppsummere dette med antall som vi hadde før, som var-- la oss snu dette igjen. Det var 101 og massevis av 0-tallet. Hvis du prøver å legge disse to tallene sammen, du kommer til å ha nøyaktig 0. OK. Eventuelle spørsmål? PUBLIKUM: [uhørbart] GABRIEL: Hva mener du? PUBLIKUM: Negativ til positive [uhørbart]. GABRIEL: Nei, du snur og du legger en alltid. Yeah. OK, så tegnene også kodet binærfiler. Vi har ASCII-tabellen, som du så også på forelesning, ikke sant? Så det er i utgangspunktet en kartlegging av ting. Og her kan jeg ikke understreke nok at for en datamaskin, og en 65 er bokstavelig talt det samme. Så hvis jeg skriver noe sånt som char c er lik en, kunne på samme tid bare skrive 65 her, og det ville være nøyaktig det samme, OK? Det er ingen forskjell overhodet. Vi vanligvis pleier å sette tegn i variabler av type. Char, ikke fordi de er i hovedsak laget for det, men på grunn av menneskelig konvensjonen. Men du kan bare håndtere heltall i stedet for variabler av typen char, og du blir fin. Den eneste virkelige forskjellen mellom en char c og en int i er at en int har fire byte i de fleste systemer, mens en røye har én byte. De er i hovedsak de samme gjelder data. Så hva vil skrive her? Her skal vi skrive et siffer ved hjelp av printf med en pluss 1, og på samme måte som heltall, chars kan oppsummeres slik tegn kan også bli summert. Så dette er nøyaktig 65. Så det kommer til å bli 66, og her har vi 65 pluss lite minus stor A, som vil være, vet jeg ikke egentlig vet. Men det vil være nøyaktig den gapet mellom de store bokstavene og og de mindre bokstaver, så vi kommer til å få liten en, ikke sant? Yeah. Så dette kommer til å skrive ut en tegn som er nøyaktig denne. Bra? Eventuelle spørsmål? Her har vi en haug med forskjellig typer for numeriske variabler. Vi allerede snakker om int. Float er bare en måte to-- dette er virkelig morsomt, fordi når jeg først lærte å programmere tilbake i dag med Python, det første programmet jeg noensinne prøvde å skrive, så jeg at det var en typen kalt inn, og en type som heter float. Og flottøren var for alle reelle tall. Så da spurte jeg hvorfor skal Jeg noen gang bruke en int da? Fordi hvis jeg kan bruke all reelle tall med en dupp, Jeg ville bare slutte å bruke ints, ikke sant? Fordi reelle tall er mye som mer generisk. Det viser seg at dette er ikke tilfelle i datamaskiner fordi de er i hovedsak forskjellige ting. Så heltall og flyter, den operasjoner som du gjør med dem er vesensforskjellige fordi av måten de er lagret, OK? Vi kommer til å snakke litt litt mer om det i et sekund. Så dobbel er bare en større flåte. Vanligvis i de fleste systemer, en flottør er fire byte, akkurat som en int. Og en dobbel er åtte byte. En lang lang er egentlig bare et symbol at du føyer til en type som int. Du sier lang lang int som dette. Lang lang int x å gjøre det lenger. Så i de fleste systemer, vil det gi åtte byter i stedet for den vanlige fire. Og du kan faktisk slippe i, så det kan bare si lang lang, og som fungerer også, OK? Du kan også gjøre andre ting som unsigned int, eller igjen bare usignert vil også fungere. Og det ville gjøre x være en variabel som alt er positivt, så du kan egentlig ikke ha negativ tallene på den måten at vi så opp her. Så etter fantastisk flyttall og presisjon. Det er en av grunnene til at du ønsker å bruke ints i stedet for flyter, fordi ints er 100% nøyaktige, ikke sant? Det er akkurat det nummeret. For flytende poeng, hvis du si svaret er lik 1 over 10-- Jeg måtte ha denne eksakte programmet her, float.c. Som skriver ut til 20 desimaler. 1 dividert med 10, og at vanligvis er 0,1, ikke sant? Men her hvis vi gjør flyte, og vi kjører det, Vi ser at det er ikke akkurat 0,1. Det er 0,149 noe. Og hvorfor er det? Fordi du ikke kan egentlig representerer hver eneste mulige reelt tall i minnet fordi det finnes uncountably mange av dem. Så vi er teknisk sett bare i stand til å representerer en begrenset mengde av disse med en begrenset mengde av data. Men det er veldig interessant. Nå er dette begs Spørsmålet om hvordan du ville gå om å representere dette med bits, ikke sant? Så hvordan blir flyter lagret? Med heltall var det enkelt. Men med flottører du vil å maksimere størrelsen, og du vil være i stand til å representere store tall og svært små tall som 0.000001 på samme tid. Så igjen, samme spillet. Er det noen som har noen anelse om hvordan vi kunne gå om å representere flyte i minnet? Bare kaste noe. Ja, takk. PUBLIKUM: [uhørlig] som Hvis det var to ints og ett å være den [uhørbart] og et vesen alt etter desimaltegnet. GABRIEL: OK, kult. Så to forskjellige heltall. Du kan ha 12.45, så det er 12 og 45. Nice. Hva ere du kommer til å si? Det samme? Yeah? PUBLIKUM: [uhørlig] notasjon hvor du skille basen. GABRIEL: Vitenskapelig notasjon, ja det er som regel det som skjer. Så dette er det som kalles mantissen. Det er det som er faktisk nummer, og deretter eksponenten er bare der komma er, ikke sant? Så dette kommer til å være noe av formen 1, 2, 3, 4, 5 ganger 10 4 til minus. Jeg innså at-- ja, akkurat. Og da dette 10 til minus 4 er kommer til å definere hvor komma er, OK? I Brasil bruker vi komma. Her dere bruke en prikk. Så en prikk. Og dette er kult, for da kan du fokusere mange av dine biter på denne fyren her, på mantisse, og så det er kommer til å være din faktiske presisjon. Og du kan gjøre dette enten i desimal eller i den binære basert system. Det finnes forskjellige måter å gjennomføre dette. Spørsmål? Ja? PUBLIKUM: Hvor mange steder etter desimal [uhørbart]? GABRIEL: Det er et komplisert spørsmål, fordi det er egentlig aldri 100% nøyaktig, fordi som du ser her, for noen tall det er 100% nøyaktige. Jeg tror at dersom vi setter 0.5 her, det kommer til å være 100% nøyaktige. Det kommer til å være 0,500000. Så i dette tilfellet, er det perfekt. Men i andre tilfeller det er mye mindre perfekt. I min erfaring, som opp til fire, fem desimaler er ganske presis. Hvis du bruker en dobbel, kommer det til å være langt mer presis enn det, OK? ROB Bowden: Så bare for å kaste litt mer kontekst på flottører, Jeg husker aldri 100% hvordan spec av flyter faktisk fungerer, men jeg tror du alltid huske som flyter begynner å få rotete. Så ideen er at når du får veldig, virkelig store tall eller virkelig, virkelig små tall, starter vi blir verre og verre til å differensiere mellom to nære flyter. Så hvordan jeg liker å tenke på er med flyttall unøyaktighet, er det to flottører som hvis jeg prøver å oppgi dem i C, til tross for at de er forskjellige tall, de kommer til å være tolkes som samme tall, fordi vi kan ikke lagre dem annerledes. Vi må bruke de samme bitene. Og så når vi kommer til virkelig, virkelig store tall, snakker som 10 til 300 eller noe, er det på det punktet at 10 til 300 eller 5 ganger 10 til 300 kan ikke bli differensiert fra 7 ganger 10 til 300. Så det er en ganske stor forskjell mellom de to tall. Men så når du kommer ned til normalområdet ting, du har en tendens til å være ganske flinke til å differensiere. Og så når du kommer ned veldig liten, du også får ganske dårlig igjen. Så ut som en hel haug med 0,0000, det blir ganske ille. GABRIEL: Ja, så en rask kommentar. Gjør aldri dette. Prøv aldri å sammenligne flyter ved hjelp av likemenn er lik, fordi selv om de er nesten det samme, nesten det samme er ikke det samme. Så det du vanligvis gjør er at du trekker dem, ta den absolutte verdien av det, og se om det er mindre enn 0,0001 eller noe sånt, OK? Og kjølig. Jeg vet at mange mennesker har noe bakgrunn i Java, spesielt de som gjorde AP informatikk, ikke sant? Og Java er et språk som for det meste basert på C, den har et par veldig store forskjeller. Men for looper, og IFS, og sånt det, er de alle samme syntaks. Jeg har noen programmer her for å vise dette. Så for eksempel en enkel hello world. Dette er hello world i C, som du gutta er definitivt kjent med, og dette, og dette er i Java. Så i Java har vi denne public class, hello world, og public static void viktigste, og streng args. Strengen args går skal vises i C svært kort tid. Men la oss ikke gå dit enda. Akkurat nå har vi tomrom her, noe som betyr at hoved er ikke ta noen argumenter. Og så har vi System.out.println, er det og at slags tilsvarende for printf. Her har vi ikke virkelig trenger backslash n fordi print ln gjør det for deg. Det føyer backslash n ved enden av linjen. Men hvis du går inn noe som en for, du kan se at de er ganske mye det samme. Så initialisering, og tilstand, og oppdateringen er-- jeg savnet en plass her-- de er ganske mye det samme, bortsett fra Java har som noen flere høyt nivå ting. Her kan vi gjøre pluss jeg og Java vil automatisk gjør dette jeg her, som er et helt tall, til en streng, og deretter legge den to strenger sammen. Her i C må vi gjøre den &% d. Linjen her, for ser nøyaktig det samme. Og hvis vi ser på hvis de ifs også ser akkurat det samme, ikke sant? Så den virkelige store forskjellene er i de tingene som du ser her. Public static, ugyldig, og Da public class hvis. Så Java har hva som er kalles en virtuell maskin. Og det er veldig tungt basert på hva kalles objektorientert programmering, som er en veldig, veldig vanlig paradigme for programmering i dag. Og denne klassen ting er det du ser, noe fra objektorientering, er du oppretter en klasse og deretter kan utlede fra den klassen objekter. Vi kommer ikke til å snakke for mye om det i CS50, men det er definitivt noe kult, spesielt hvis du ønsker å gå inn mer sofistikert webutvikling på slutten av kurset, som sender inn det endelige prosjektet og noen fine rammer og sånt. Så i utgangspunktet ideen er at du ønsker ikke å re-implementere noe, så du skape noe som er svært generisk, som form, og deretter oppretter ulike former fra det, og deretter fra hver av disse formene, oppretter du noen mer spesifikke former i tre dimensjoner eller noe sånt. Og de har dette hierarkiet de arve fra de andre, så alle funksjoner og variabler som spiller den store formen her har, alle disse kommer til å ha, og alle disse er skal ha, og så videre og så videre. Så det er den grunnleggende ideen. Har C ikke det, men C ++ har den slags funksjon. Og Java er sterkt påvirket av objektorientering, så det er derfor du ser klasse her hele tiden. Og den andre tingen er Dette Java virtuell maskin. Så dette, tror jeg, er en veldig smart idé. Så hva folk som oppfunnet java gjorde er de ønsker ikke å kompilere koden sin to ganger hvis de måtte kjøre den i et Windows, eller en Mac eller Linux, så hva de gjør er de bokstavelig talt kjøre noe sånt apparatet, men du forstår ikke helt se at det skjer. Så de kjører en virtuell maskin innsiden av datamaskinen, noe som er i utgangspunktet som en mini operativsystem. Og at drifts systemets formål i livet er bare å kjøre det som kalles byte kode. Så i stedet for i C, måten vi ville kompilere dette er at hvis, og deretter kjøre ./if. Jeg glemte backslash i. I Java, ville du gjøre først Java C for å kompilere den, if.c. Det er ikke C. Det er dot java. Og så må man kjøre ikke ./. Du får denne nye filen if.class, men du kan egentlig ikke kjøre if.class nå bare som vi gjorde før. Dette er ikke en kjørbar. Du må løpe. Du må mate den inn et program som heter Java, og at programmet er den virtuelle maskinen, og deretter du gjør if.class, eller hvis. Ja. Og så fungerer det. OK, så dette er slags virtuell maskin skjer. Har ikke C det, så hvis jeg skulle sette dette programmet i en Windows-maskin, det ville ikke fungere i C. I Java den gjør. Spørsmål? Cool. Det er hvis for super-delen for i dag.