ROB: Tudo bem. Bem-vindo à primeira seção. Estou Rob. JOSÉ: Eu sou Joseph. ROB: Então, vamos mergulhar para a direita dentro A primeira coisa a falar sobre é o Appliance. Portanto, esperamos que a maioria de vocês tem baixado já. Mas você pode ver as instruções em cs50.net/appliance. Oh Deus, agora eu sou auto-consciente. Eu ainda ouvi-lo. JOSÉ: Wow, parece que é desorientado. ROB: Então, algumas pessoas têm tido problemas com ele, então não espere até o último minuto do problema definido para tentar resolver o aparelho e descobrir que ele não está funcionando. JOSÉ: E se algo não está funcionando e você precisar de ajuda, você pode ir para cs50.net/discussion onde nós tem um fórum onde você pode postar suas perguntas. E nós vamos chegar a eles eventualmente. ROB: Tudo bem. Então, isso é o que o Appliance parece. Mais uma vez, é apenas uma completamente separada sistema operacional rodando dentro qualquer sistema operativo que estão funcionando em seu laptop. E as principais coisas que você estar usando são gedit. Portanto, esperamos que este já tem tornar-se um local conhecido. O terminal. E você também pode executar o Chrome dentro do aparelho. Houve um par de pessoas que relataram internet não funciona no aparelho. E alguns deles têm apenas assumi que não é suposto ser internet no aparelho. Mas sim, lá é suposto para ser segura. Eu vou dizer isso agora, mas isso não acontece realmente quer dizer nada. Se a internet não está funcionando, isto é o que você tende a precisar correr para corrigi-lo. Se você está tendo problemas de internet, não lembre-se que, apenas publicá-la em Discutir, e vamos dizer, executar isso. Mas a internet deve estar funcionando. Assim, a única outra coisa - sim, nada o resto é realmente relevante. Mas eu só queria salientar que - ver neste canto inferior direito. Assim, cada um de seus aparelhos deve tem um endereço de IP. E no final do semestre, este IP endereço se tornará mais relevante quando você está trabalhando na web p-set, porque você será capaz de acessar o site que você está trabalhando a partir de sua Chrome local usando esse endereço IP. Mas o que eu gosto de usar o endereço IP for - e você não tem que fazer isso, eu só quero indicá-lo - está aqui. Portanto, esta é uma janela de terminal em meu Mac, isso não é no Appliance de todo. E você pode procurar o que este comando faz. Mas eu estou indo diretamente para SSH ao meu Appliance. Eu não sei o que o IP é. JOSÉ: 168 - 168.224.1.0. ROB: Então uma vez que eu sou feito com isso, fazer logon dentro Agora, basicamente, este é idêntico ao de um janela de terminal dentro do meu Appliance. Então, eu praticamente nunca realmente funcionou de dentro do próprio aparelho. Eu sempre tenho que correr no fundo minimizado e SSHed nele. O problema com isso é que você não vai para ser capaz de utilizar facilmente gedit directamente a partir deste. Mas se você quiser ser um verdadeiro legal hackers, então você deve se acostumar a um linha de comando editor de texto de qualquer maneira. Então Vim e Emacs e Nano, todos estes diferentes alternativas. Nano tende a ser o mais fácil. E eu acho que não tem destaque de sintaxe. Oh, não, é totalmente faz. Então você pode usar Nano, porque que um é muito fácil. Você vê todos estes comandos na parte inferior. Este símbolo pouco de cenoura. Se você ainda não viu isso antes, você vai provavelmente vê-lo muito agora. De modo geral, significa a cenoura controle, como o inferior esquerdo do teclado caractere de controle. Então, aqui ele está me dizendo aqui - oh, não é cortado se eu zoom in Então, de controle, X é como Eu vou sair. E ele diz que eu posso bater Y para Sim, para a poupança, N para Não. Então, isso é Nano. Vim e Emacs tendem a ser ligeiramente mais complicado e desgastante. Mas você pode se acostumar com isso, e então você vai adorar. Então é isso. JOSÉ: Não há necessidade de fazer isso. ROB: Yeah. Você é livre para usar para o gedit restante do semestre. Assim, todas as perguntas relacionadas com o aparelho? Ou você tem alguma opinião sobre o que mais precisa ser falado sobre o aparelho? Sim. COLUNA 1: Quando você SSHed em sua coisa, foi o carmesim senha? ROB: Yeah. A senha para praticamente tudo no Appliance vai ser carmesim. COLUNA 2: Instalar como um verdadeiro IDE no aparelho, ele vai trabalhar? ROB: Eu imagino Eclipse tem um Versão Fedora, caso em que, sim, você pode fazer isso. Provavelmente não é realmente vale a pena. COLUNA 2: OK. Por isso, é provavelmente mais fácil se eu queria usar o Eclipse, é só usar o nativo e em seguida, fazer o upload para - ROB: Oh, que também é provavelmente mais fácil. Mas você pode fazê-lo funcionar dentro do aparelho. JOSÉ: E para a câmera, a questão foi, você pode instalar outro IDE dentro do aparelho? ROB: Eclipse sendo um exemplo de uma IDE. Qualquer outra dúvida aparelho? Tudo bem. Então, vamos agora avançar para a linha de comando coisas relacionadas com a interface, de modo CLI. E mais uma vez, eu só estou indo para o trabalho em aqui, porque este é idêntico ao trabalhando dentro de uma janela de terminal dentro do aparelho. Como está essa fonte procurando? É grande o suficiente? Tudo bem. Então, há uma série de comandos que você deve ficar muito utilizado para ao longo do semestre. A grande dois para navegar são ls, lista os arquivos nesse diretório, e cd, assim que mude de diretório. Então, eu posso mudar a área de trabalho e, em seguida, um padrão muito comum é a de um cd diretório e imediatamente ls o que está no diretório. As pessoas também, por vezes, não percebem que Tab conclusão é uma coisa. Assim como cd, vh, e então eu bati Tab. Eu quase nunca digitar a coisa toda. E então se eu continuar batendo Tab novamente, ele vai automaticamente começar a lista para mim. Então eu posso cd vhosts, host local. E isso só vai - no caso de você não ter ouvido o termo antes, o diretório é apenas outra palavra para pasta. Portanto, agora se você vê - vamos trazer isso para o topo. Portanto, agora se você vê entre parênteses, você ver o pequeno til, barra, vhost, slash, host local. Assim, o til, que se refere para o meu diretório home. É um diretório que você está quando você SSH dentro É o diretório que você está em quando você abrir um terminal. É onde você começa. E assim eu estou dentro do meu diretório home, e eu estou dentro do vhost diretório dentro do meu diretório home. E então eu estou dentro do local, diretório hospedar dentro disso. Por isso, algumas outras coisas úteis com cd - ou bem, em geral, de modo dot sempre refere-se ao diretório atual. Cd, dot é um comando bastante inútil. Mas isso está mudando para o diretório atual. A mais útil em termos de cd é ponto, ponto, que é basta ir até um diretório. E note que estes - Eu quero dizer aliases, mas estes símbolos, ponto e ponto, ponto, os trabalhos para praticamente qualquer comando que você está vai estar pensando em correr. Assim como cd é provavelmente o lugar onde você vai ser utilizando a maior parte, mas estes não são coisas que só cd compreende. É praticamente algo que o seu todo linha de comando compreende. Um monte de programas entender ponto e ponto, ponto. Assim, os outros úteis - cd, Dash. Então isso vai me trazer para a último diretório que eu estava dentro Então, às vezes eu vou fazer algo como: oh, eu estou trabalhando aqui. E eu vejo algum erro com alguma coisa, e Eu vou investigá-lo, indo para algum diretório aleatório em algum lugar. E eu não sei se ele vai deixe-me lá dentro. Ele o fará. Então eu faço o que eu quiser neste diretório. Blá, blá, blá, blá, blá. E eu estava tipo, tudo bem, eu quero voltar para onde eu estava. cd, traço, e isso me traz de volta. Então, eu vou jogar um monte destes em você hoje. Eu não espero que você memorize todos eles. É uma espécie de apenas saber que eles existem. E mais tarde, quando você está como, hmm, eu quero voltar para o diretório que eu estava em, oh, espere, algo parecido com o que existe. Você não tem que basta digitar em todo o diretório novamente. JOSÉ: E, eventualmente, você será apenas usá-los uma e outra vez, e ele vai se tornar a memória muscular. ROB: Yeah. Então, como eu disse antes, que til é o seu diretório home. Então eu posso cd, til. Mas não tem sequer a fazer isso se eu - Eu vou voltar para o diretório assim não é um exemplo inútil. Mas se eu apenas fazer cd, que também é o mesmo que, ir para o meu diretório home. Eu faço Comando, K. JOSÉ: Você também pode digitar clara, a palavra, e ele deve limpá-la. ROB: E eu acho que também de controle, L também o faz. Então muitas maneiras diferentes. Eu acho que há algumas diferenças onde clara e Controle, L será apenas realmente empurrá-lo para a parte superior e Eu ainda pode rolar para trás. Command, K literalmente destrói tudo, e você não pode rolar de volta. No mínimo, isso é como ele funciona em iTerm2. Eu não sei como as outras coisas - oh. Com sshing, por isso, se você estiver no Windows, você vai ter que baixar PuTTY a fim de SSH desde o Windows não faz tem como uma ferramenta interna SSH. De Macs, você pode apenas SSH diretamente a partir de uma janela de terminal. OK. Dúvidas? Com ls, assim que algo que se acostumar com com a maioria desses comandos é - bem, eu vou fazer um. Ls, traço, l. Então, traço, l é o que vamos para chamar um sinalizador para ls. E muitos desses comandos têm bandeiras que você pode passar para eles. Portanto, neste caso, traço, l é uma bandeira que diz-lhe para me dar um completo listagem de toda a informação desses arquivos. Assim, vemos aqui que o desktop foi modificado em 30 de julho às 12:54. De downloads foi modificado em 6 de setembro. Estes são o tamanho actual e bytes desses diretórios. Você não tem que entender tudo isto. Este material à esquerda, estas drwx de, que se tornará muito mais relevante mais tarde, quando você tem que lidar com - que tem a ver com o que tem permissões olhar para esses arquivos. E por isso, se você não foi o único usuário em este computador, você seria capaz de digamos, OK, eu deveria ser o único permissão para olhar para este arquivo ou eu sou vai permitir que todos de olhar para este arquivo. Então, alguém no meu computador pode olhar para esse arquivo. Eu nem sei o que isso - o que isso faz? JOSÉ: Eu não tenho certeza, na verdade. ROB: Não faço ideia. JOSÉ: Mas se você não sabe, não existe um comando útil que você pode usar para dizer o que significa a saída. E se você digitar no homem antes do comando - assim M-A-N. ROB: Homem. Assim, o homem é mais um que é muito útil. E o homem, ls. Assim, as páginas do manual, eles têm tanto comandos que você vai estar usando na linha de comando, e eles também têm funções que serão relevantes com C. Assim, pode o homem - e eu ignorei 3. Mas man 3 printf vai trazer a versão C do printf. Mas se eu só faço o homem printf, este é vai abrir o comando printf que acontece na linha de comando. Assim, o homem, sl. As páginas de manual pode ser muito avassaladora. Aqui, porém, você vai ver este anúncio de todas estas bandeiras que ls entende. Então, se formos a correr, l, e - Eu só vou jogar isso em você. Mas, a fim de pesquisar, você quer ao primeiro hit a questão botão barra marca ou. Então Slash. E então eu posso pesquisar para o que eu quero. Então eu vou cortar para traço, l. E lá estava ele. Portanto, use um formato de listagem longa. Isso não me ajudar a descobrir o que que determinada coluna quis dizer, mas eu assumir em algum lugar aqui isso explicaria isso. Portanto, use as páginas man para qualquer comando que você não entende de imediato. Tenho certeza que você pode até mesmo homem, o homem. Uma interface para o on-line manuais de referência. Ah, um último um que é talvez um pouco ls relevante é, traço, um. Então, observe se eu apenas fazer ls, Recebo estes cinco arquivos. Se eu fizer ls, traço, um, eu obter um lote mais arquivos. Assim, a coisa em comum entre todos estes novos arquivos é o ponto de antemão. Assim, a convenção é que um arquivo que começa com um ponto está escondido. Então você não quer ver esse arquivo, você não quero ter que mexer com sua listagem do diretório. É só quando você explicitamente perguntar, tudo bem, ls, traço, um, me mostrar. O um significa todos os arquivos, incluindo as ocultas. Assim, alguns outros comandos. Oh, questões em que ponto? Sim. COLUNA 3: Quando você faz ls, um, qual é o ponto, ponto? ROB: Ah. Então é isso que eu estava falando. É a mesma coisa que Eu posso gostar de cd, ponto, ponto. Então, tecnicamente, ponto e ponto, ponto são arquivos que existem em cada diretório onde o arquivo ponto refere-se para o diretório atual. Então, se eu cd, ponto, eu só vou para ficar no diretório. E ponto, ponto sempre se refere ao anterior diretório um nível acima. Então, se eu entrar em toras e ls, traço, al, Vou ver ponto, ponto. cd a ponto, ponto me leva para o diretório anterior. É. OK. Assim, uma outra muito importante comando é rm. Então é isso que nós vamos usar para remover. E deixe-me realmente fazer outra primeiro comando. Então mkdir. Mkdir é como você pode criar diretórios. E eu vou criar um diretório temporário e ir para o diretório temporário. E, como esperado, é vazio. Mas se ls I, traço, um, eu ainda tenho dot e ponto, ponto, porque se refere a ponto o diretório atual. E ponto, refere-se ao ponto diretório anterior. E aqueles sempre vai existir, não importa o diretório que você está dentro E este é um completamente desnecessário comando, mas toque. Estou apenas usando-o, porque é uma maneira fácil de criar arquivos. Então tocar um, toque em b, toque em c é apenas vai criar três arquivos chamados um, b e c que estão completamente vazias. Assim, o ponto de me criar os do primeiro lugar é apenas para que rm é como podemos removê-los. Então, rm, a. Vai me perguntar, remova regular de um arquivo vazio? E então eu vou dizer que sim. Então, se eu tenho certeza que eu quero apagar esse arquivo sem ter que ser solicitado, remova arquivo vazio regular?, em seguida, rm, traço, f vai ser o bandeira que diz, sem forçar a remoção até me alertando, oh, é você certeza que deseja excluir o arquivo? Sim, eu tenho certeza. Então, rm, traço, fb será apenas fazê-lo sem pedir. Então, vamos fazer mais alguns diretórios. mkdir, tmp2, cd, tmp2, tocar um, toque em b. OK. Então agora eu quero remover tmp2 como um diretório. Tmp2 Então rm. Você não pode remover tmp2, é um diretório. Portanto, a questão aqui é que rm não trabalhar imediatamente em diretórios. É só significou para arquivos como arquivos não-diretório. E assim, o que podemos fazer aqui é rm, traço, r. Isso significa de forma recursiva, o que pode não significa nada para você ainda. Mas quando você começa a recursão, isso vai significar mais. Então, rm, traço, r, tmp2 vai recursivamente ir para o diretório. Então descer diretório tmp2? Sim, vamos a isso. Queremos remover tmp2 / a? Sim. Queremos remover tmp2 / b? Sim. Agora queremos remover o tmp2 diretório? Sim. E agora o diretório e tudo dentro de que tenha sido removida. Não é tecnicamente um comando rmdir que você pode usar para remover diretórios, mas ele só funciona em diretórios vazios de qualquer maneira. E ver que, vamos apenas fazer mkdir, tmp2 novamente. Tmp2, toque a. OK. Então, se eu tentar remover dirtmp2, vai dizer, o diretório não vazio. Então, eu praticamente nunca usar o remove comando dir qualquer maneira, porque rm, traço, r funcionará em diretórios vazios e diretórios não vazios. E também, se eu não quero ter que passar por todo esse processo de descendo para o diretório e remoção de cada arquivo individual, rm, traço, rf, tmp2. E agora ele se foi. Algo que ter cuidado é sobre rm, traço, rf. E isso me assusta até mesmo escrevê-lo, porque se eu acidentalmente pressione Enter ou algo assim. Então, rm, traço, rf, til seria, sem me avisar, o f não solicita mim, ele irá remover automaticamente meu diretório home inteira e tudo na mesma. Assim, você pode pensar que é uma coisa estúpida de se fazer. E bem, é. Mas isso pode acontecer muito facilmente por acidente se, por exemplo, eu queria remover minha barra, diretório vhost. E só na digitação rápida, Eu acidentalmente fazer isso. Isso irá remover de forma recursiva tanto a minha diretório eo diretório vhost neste diretório específico que apenas passa a não existir agora. Mas isso ainda seria remover meu diretório home inteira. Pelo menos por não ter uma f, ele iria me pedir em primeiro lugar. E eu seria como, oh, não, eu Não quero fazer isso. Mas as pessoas, slash, incluindo me tendem a entrar no hábito de sempre rf-ing. Mesmo os arquivos regulares que eu posso apenas rm, c, que tendem a apenas rm, traço, rf, c. Só tome cuidado quando você está rf-ing. COLUNA 4: O que fazer C? ROB: C é que eu estou falando sobre esse arquivo C neste diretório, que rm, c. JOSÉ: E mais perigosamente, se você usar uma estrela, refere-se a tudo em o diretório. Então o que eu geralmente tendem a fazer é que eu vou entrar em um diretório e eu quero remover todos os arquivos lá dentro. Então, rm, traço, rf, estrela. ROB: Yeah. Rm, traço, rf, estrela. JOSÉ: E se você não tiver cuidado o que você está no diretório - Eu não estava em temp, mas eu estava acidentalmente no meu diretório home, então eu vou remover tudo no meu diretório home. E eu realmente fiz isso antes, e Eu acho que você já fez isso antes ou Jay fez isso antes. ROB: Eu removi acidentalmente - assim ignorar esse comando um pouco. JOSÉ: Não é divertido. ROB: Então, no diretório bin barra é um monte de arquivos binários onde vai ser os familiares como bumbum. Bem, bumbum e, basicamente, todos estes as coisas que eu estou rodando ao comando linha estão neste diretório bin barra. JOSÉ: Como ls está aqui. ROB: Então dot, slash, ls seria listar neste diretório. JOSÉ: Rm também neste diretório. ROB: Eu acidentalmente rm, rf-ed bin, que removeu qualquer comando que pude possivelmente querer. Que, em seguida, eu só reinstalar um novo Appliance naquele ponto. JOSÉ: Então, muito cuidado quando você usar este comando. AUDIÊNCIA: [inaudível]? ROB: sim. Isso também é um mau hábito de entrar. Se você notar, eu sou agora - bem, você não pode notar, mas minha zoom-in talvez possa. Então, eu estou agora root @ aparelho. Então jharvard é o usuário que queremos você sempre estar usando. Root é o usuário que tem permissão para não fazer absolutamente nada. Então, observe quando estou jharvard, se eu tentar cd - o que é um diretório que? Oh, a raiz é um bom exemplo. Então cd, raiz. Permissão negada. Porque se olharmos para este anúncio - e, novamente, você não tem que inteiramente entender isso. Mas esses três traços estão dizendo que não deixe qualquer outro usuário para este diretório. E o diretório acontece a ser de propriedade do usuário root. Assim, o fato de que eu sou e não jharvard aquele que não é raiz é permitido em Neste diretório, isso significa que eu sou vai ficar permissão negada quando eu tentar cd nele. Então, quando eu sou raiz, eu tenho permissão para fazer absolutamente qualquer coisa, inclusive apagar arquivos essenciais para o aparelho e destruir a coisa toda. Portanto, é um mau hábito de entrar apenas vagando ao redor de sua sistema operacional como root. Eu faço isso de qualquer maneira. Dúvidas? E eu vou sair da raiz, ficar como jharvard. OK. Comandos mais relevantes. Então, voltando ao nosso temp, o mv comando significa movimento. Você pode mover a. Agora queremos chamá-lo b, então agora ele é chamado b. Ou talvez nós deseja mover b-se um diretório. Então, agora vazio deste diretório. Eu vou voltar para o meu diretório home, e vemos que b está aqui, porque o diretório home foi um diretório a partir o diretório que b estava dentro Há também cp. Então cp é copiar seção super, ponto, o texto. Posso chamá-lo é, ponto, texto. Agora temos dois super-seção, ponto, texto, e s, de ponto, o texto. Isso também funciona em diretórios. Eu RF-ed um único arquivo. Assim cp - bem, primeiro vamos tentar cp, tmp, tmp2. Assim, omitindo diretório tmp. Assim, semelhante ao rm, o comportamento padrão é não trabalhar em diretórios. E, novamente, semelhante ao rm, o padrão comportamento - bem, fazê-la funcionar com diretórios é um, traço-r de distância. Então copiar recursivamente a temperatura diretório no tmp2. E agora temos tanto tmp e tmp2, e que não é tão útil desde tmp estava vazio, em primeiro lugar. Tmp2. Agora vamos copiar tmp em tmp2. E vemos que tmp2 também tem o arquivo um, porque o diretório e tudo dentro do que diretório foi copiado. E isso pode ser um pouco útil se, digamos que você está trabalhando em um conjunto de problemas - ou na verdade, conjuntos de problemas posteriores são ainda mais importante, porque não há Será um grupo inteiro de arquivos e coisas. Mas você só quer, por uma fração de segundo, você fica tipo, tudo bem, eu sou vamos tentar algo diferente. Deixe-me apenas copiar toda a minha pset1 diretório de backup em pset1 de modo que se Eu acabo estragar as coisas, eu posso voltar para o meu diretório de backup. Existem maneiras mais adequadas de versionamento fazer backup de seu código, mas esta é sempre uma maneira rápida de fazer apenas se você tem uma cópia de algo que você está prestes a modificar. Então eco também é um comando único que tipo de sillily só vai imprimir na linha de comando exatamente o que você queria fazer eco. Assim ecoam oi. Nós vamos apenas imprimir oi. Eco Olá mundo. Vamos imprimir Olá mundo. Isso vem em uso quando você começar a combinar comandos. E mais uma vez, não esperam que você inteiramente entender isso ainda, mas é algo a ver. E então, se você está pesquisando para exemplos ou você percebe que você quer fazer algo, ele pode ser útil. Então, vamos, como exemplo, ls assim, traço, l. Então, aqui eu vejo a saída de ls, traço, l. E eu digo: OK, eu quero armazenar isso em um arquivo. Tudo isso de saída aqui, eu quero para colocar em um arquivo separado. Então este pequeno símbolo maior que é o que vamos chamar. Estamos redirecionando o saída para um arquivo. Vamos chamar o arquivo blá, porque isso é o que eu tendem a chamá-lo sempre. Então, agora, vemos que temos um arquivar blá aqui. E se eu abri-lo, eu vou vê-lo é exactamente o resultado do comando que eu só corri. E da mesma forma, você pode - se isso era a saída para um arquivo, este é obter a entrada de um arquivo. O que é um comando que eu - JOSÉ: Eu acho que você pode usar menos ou mais, provavelmente. ROB: Mas como sobre apenas menos blá? Eu não sei. Se você entrar neste cenário, como Série de Exercícios há que ele é útil para. JOSÉ: Você pode canalizar-lo em eco. Canalize o arquivo em eco para vê-lo. ROB: É pipe. JOSÉ: Desculpe. ROB: Tudo bem. Portanto, esta é a saída para um arquivo. Este é obter o texto a partir do arquivo e entregá-lo para o programa. E você também vai ver esse cara. Portanto, esta é uma espécie de fazer os dois ao mesmo tempo. E na verdade, eu vou apresentar dois novos comandos apenas para fazer uso dele. A história é um comando útil que é apenas vai imprimir uma listagem de qualquer coisa que eu já executar uma linha de comando. Assim, vemos aqui tudo o que eu tenho corrido esse tempo todo. Muita ls do. E outro comando útil é grep que o seu objectivo é a pesquisa sobre texto à procura de padrões, bem, olhando para o que você quer que ele procurar. E assim, um uso prático aqui é, digamos queremos agarrar a história. E eu quero olhar para os comandos onde eu - o que é um um útil para procurar? JOSÉ: [inaudível]? ROB: Ou vamos apenas olhar para todos toca, por qualquer motivo. Então é isso que ele vai ficar. E você não tem que completamente entender isso. Mas a idéia é aqui, a história está a dar o mesmo resultado que fez aqui onde está imprimindo a todo história de tudo que eu já executado. Estamos, então, de passagem, que - assim, em vez de imprimi-lo para a tela, queremos passar isso para o comando grep que está procurando todas as ocorrências da palavra toque. E assim, usando essa combinação de ferramentas de história e grep, eu posso ver, OK, aqui está todos os comandos que eu já correr, e aqui está um pouco comum. Estamos na parte inferior. E isso também me dar o comando Eu corri que tinha o toque palavra nele. Mas o tubo é uma coisa muito útil para a combinação de vários programas. E, na verdade, é um atalho para deixar me história saída para o arquivo blá, e deixe-me usar o grep blá arquivo como o que eu quero olhar. Assim, o tubo é apenas um atalho para esses dois comandos. Sim. COLUNA 4: [inaudível]? ROB: sim. O que é - Oh. Vamos testar. Então, gato, cachorro, peixe. Então, eu quero grep. Dash, R, mais uma vez, vai ser recursiva, então eu quero descer para baixo todos os diretórios. Quero grep recursivamente para todos - e me deixe temporariamente esta fora do caminho. Ignore-me. OK. Então, eu quero grep temporariamente para todas as ocorrências da palavra peixe. E aqui o que eu estou fazendo é grepping recursivamente para a palavra peixe. E estrela significa mais de todos estes arquivos nesse diretório. E por isso me deu uma permissão negada, porque não está autorizado a ler que arquivo específico. Mas ele encontrou peixes no arquivo, teste. Eu também poderia dizer, especificamente, eu só quero olhar no blá arquivo, em caso em que ele não vai encontrar nada. Eu só quero olhar no arquivo, teste. Ele vai encontrar peixes. Isso é um comando muito útil a saber em geral. Existem algumas alternativas para grep que é suposto ser mais programador amigável, mas tendem para ainda voltar a cair grep. Dúvidas? OK. Existem outros comandos? Oh. Apenas um one-off que eu sempre encontrar para ser divertido é CAL. Então, observe quando estou nesta linda modo de tela cheia, não tenho como top barra de ferramentas ou qualquer coisa. Então cal só me dá um pouco de bom calendário que é certo agora cortar, eu assumo. Mas pouco agradável de comando. JOSÉ: É [inaudível]. Outros comandos que você pode ter visto incluem bumbum e fazer. Nós vamos passar por cima deles em mais detalhes posteriormente. Mas se você está trabalhando em o PSET, você deve estar familiarizado com aqueles. ROB: Tudo bem. Perguntas sobre comando de linha de coisas? Tudo bem. Então, vamos passar para alguns Coisas relacionadas-C. Variáveis ​​de matemática. OK. Assim como tivemos matemática em Scratch, você também pode usar a matemática em C. Antes de chegarmos a isso completamente, assim variáveis. Lembre-se que sempre que você declarar um variável como int x ou y bóia, você tem que dar antes de digitar o nome da variável. Assim, os tipos que vimos até agora são int, float, double, long long, que eu na verdade, não sei se temos visto que, até agora. Existem alguns outros. Nós ver Char. Há curto, que é como se fosse o oposto do longa, longa, onde é menor do que um número inteiro. Vimos também string. Então, o que é especial sobre corda? Por que eu digo que é não é bem como int? COLUNA 4: Realmente não existe. ROB: Yeah. Assim, a única razão pela qual temos corda é porque quando você faz hash incluem cs50.h. E vamos ver exemplos desta tarde - oh, isso não lidar com isso bem - onde cs50.h está fazendo algo ao longo das linhas de Tipo def, char estrela, corda. E o que é dizer que nós não sabemos ainda sabe o que uma estrela char é ainda. Mas isso está dizendo que nós queremos string. Qualquer lugar que você está usando corda, você poderia ter usado o caractere estrela, que realmente é um tipo que existe na linguagem C. Mas nós vamos chegar a isso. Ah, e ele vai para a direita de volta. Neat. Assim, mesmo com bool onde o verdadeiro eo falso. Isso não é realmente um tipo de embutido em C. Em vez disso, é apenas, que isso tem o valor zero? Então vamos considerar apenas que ela é falsa. Isso tem o valor - bem, isso tem qualquer valor que não é zero? Então vamos considerar que ela é verdadeira. Então, é verdade, dois é verdadeiro, qualquer coisa diferente de zero é verdadeiro. Portanto, estas são esses. Dúvidas sobre declaração de variáveis ​​e tipos de variáveis ​​e tudo isso? É. COLUNA 4: Por muito tempo longo, no livro, ele disse que tinha que ser long long int. Mas vai funcionar muito longo tempo? ROB: Então esses modificadores de tipo. Assim, int x. Assim, podemos também dizer unsigned int x. Podemos dizer short int x. Podemos dizer long long int x. Mas praticamente qualquer daquelas coisas que eu apenas disse, int sem sinal, short int, long long int, você pode se livrar de int e ele vai assumir que você quis dizer int. X Então não assinados, que apenas significa - você sabe como normalmente com um int, você pode dizer que x é igual a 3 negativo? Com um int sem sinal, você não pode. JOSÉ: E mais uma vez, para a câmara, o pergunta era: qual é a diferença entre long long int e apenas o tempo? ROB: Yeah. Então, eu quase nunca escrever long long int. Vou escrever long long. JOSÉ: Alguma pergunta? ROB: OK. Pequeno lembrete tão bobo de que é como declaramos uma variável e inicializar a variável e declarar outra variável e inicializar tudo isso em uma única etapa. Assim, a declaração da variável e a variável de inicialização não tem a, mas pode ser na mesma linha. Portanto, temos os operadores matemáticos padrão que você está acostumado - mais, menos, dividir os momentos. Há também modulo, o que vamos ver. Não existe, pelo menos em C, um built-in potência operador circunflexo exponenciação. Bem, há um operador acento circunflexo, mas não é poder. JOSÉ: Mas não é exponenciação, Sim. ROB: Não use o acento circunflexo supor que isso significa como quadrado ou qualquer outra coisa. Por isso, algumas coisas para manter em mente sobre divisão. Eu estarei. Assim declarou resposta initialize. Então, nós estamos dizendo resposta flutuador é igual a 1 dividido por 10. Imprimir resposta para duas casas decimais. E este é o tipo de coisa que eu seria o homem printf para descobrir que o que diabos%, ponto, 2f significa? E isso apenas significa que, bem, ignorando a 0,2. E%, f é o que usamos para imprimir a flutuar. O 0.2 está dizendo, a impressão que flutuar até duas casas decimais. Portanto, este programa tem um bug, e você pode já vi isso antes em algum Naturalmente CS antes. Mas o que é esse bug? COLUNA 5: Zero. ROB: Yeah. Assim, quando dizemos, a resposta é igual a 1 dividido por 10, queremos que o responder a ser 0,1. Mas 1 dividido por 10, 1 é um número inteiro, 10 é um número inteiro. E assim, quando fazemos um inteiro dividido por um inteiro, vamos voltar um inteiro. Então 1 dividido por 10 é de 0,1. Desde que ele precisa nos dar um inteiro, ele só vai jogar fora que casa decimal e dizer que a resposta é 0. E assim, quando nós imprimimos responder aqui, ele vai imprimir 0,00. JOSÉ: E assim como uma nota, ele realmente joga fora o que há depois da ponto decimal. Então, se você, em vez tinha 6 dividido por 10, você pode pensar que ele iria dar-lhe 0,6 e então você arredondar para 1. Mas, na verdade, o que acontece quando se digita tarefas é que ele deixa cair o que é depois do ponto decimal. Assim, se torne 0,6 0. ROB: Yeah. E nós vamos dizer truncada por isso. Assim, sempre que você converter para um int, o decimal é truncado. Assim, a correção para que - não há na verdade, dois. E eu vou fazer isso, segundo, porque esta é uma solução muito mais fácil. Então, uma correção é usar flutuadores na divisão. E realmente, você só tem que fazer um deles um carro alegórico. Mas é apenas um pouco mais clara para fazer os dois flutuadores. Então, 1,0 dividido por 10,0 é divisão de dois carros alegóricos. Portanto, a resposta vai acabar sendo um float, e assim você vai corretamente imprimir 0,10 aqui. Algo que não funciona tão bem sobre o que é, bem, com certeza, era fácil suficiente para converter um a um flutuar, tornando-a 1.0. Mas e se em vez tivemos dois inteiros como int x é igual a 1 e int y é igual a 10, e, em seguida, queríamos para que x dividido por y? Assim, não é fácil de apenas fazer x.0 ou algo assim. Assim, a correção para que está lançando. Então, lançando é uma maneira em C para converter a partir de um tipo de variável para outro. Então, aqui, 1 é um inteiro. E, colocando esta bóia em frente isso, estamos lançando um a um float. E para que isso irá converter a 1 a 1,0 um. E isto converterá a 10 para uma média de 10,0. E então as coisas se comportam de forma semelhante ao versão anterior, apenas mostrou em que, conforme o esperado, obtemos 0,10 e ele vai imprimir isso. E nós podemos fazer isso com variáveis, também. Assim, podemos dizer, float x dividido pelo flutuador y. JOSÉ: Alguma pergunta? ROB: Então, assim como na matemática regular, temos precedência do operador. Então, na aula de matemática, você é mais provável chamá-lo de ordem das operações. Aqui, o termo oficial é precedência do operador. Mas a precedência do operador, ou mais operadores, é como seria de esperar. Assim como em matemática, 2 vezes 10 é vai ser agrupados mais perto do que 10 esta dividida por dois e, em seguida, 2. A ordem das operações, que vai fazer 2 10 vezes, 10 dividido por dois, e depois ele vai fazer 20 mais 5 mais 2. Então, é como se esperava, e você pode usar parênteses para agrupar expressões. Você não pode usar colchetes para agrupar expressões. Sim? COLUNA 5: Você poderia realmente só voltar um segundo? Você pode lançar um int em uma string? ROB: Então, em C, você pode lançar qualquer coisa Você quer o que quiser. Isso não significa que ele é uma boa coisa a fazer. Então, quando você lançar um int para uma corda, o que significa - e nós vamos entrar neste muito mais profundamente - JOSÉ: Muito mais tarde. ROB: Eu não quero dizer muito mais tarde, então eu tentei mudar a minha frase. Nós vamos entrar muito mais minuciosamente mais tarde, onde realmente quando você tem um variável string - assim que uma corda pode ser arbitrariamente muito tempo, certo? E nós temos vindo a dizer que é um int quatro bytes e longo tempo é de oito bytes e um float é de quatro bytes. Assim, uma corda, como um int, só tem um certo número de bytes à mesma. E isso vai ser de quatro bytes. Mas uma série pode ser bastante arbitrariamente longo, certo? Então Olá mundo já, se é 10 caracteres ou qualquer outra coisa, que já está vai ser ao longo dos 4 bytes I podem se encaixar em uma string. E assim como cordas realmente funciona é que eles são, onde na memória essa seqüência está sendo mantido. E assim por aqui, quando digo corda x Olá mundo é igual, dentro de x é apenas dizendo, oh, Olá mundo é armazenado neste lugar especial na memória. Então, se nós tentamos lançar um inteiro para um string, então estamos tentando interpretar alguma parte aleatória de memória como uma string. E isso quase sempre quebra as coisas. JOSÉ: Mas se isso confunde você, nós estaremos cobrindo-o mais em profundidade mais tarde. ROB: Yeah. Este é o lugar onde você está indo para entrar em ponteiros. E essa é uma parte significativa de duas semanas de curso. COLUNA 6: Funciona como objetos em outras línguas ou não verdade? ROB: Então, em outras línguas, objetos seria representado usando ponteiros. Não é a mesma coisa, no entanto. Quaisquer pensamentos? JOSÉ: Não. Sem pensamentos. ROB: OK. JOSÉ: Next. ROB: Basta ir com isso. Tudo bem. Assim módulo. Assim como nós temos mais, menos, dividir e multiplicar. Então modulo é aquele que você pode não tenha visto antes. E ele apenas diz, dar me o restante. Assim, 55% 10. O restante de fazer 55 dividido por 10 seria 5. Assim, 55% de 10 é 5. E 3% 5 será de 3. 8% 8 será 0. 16% 15 será 1. JOSÉ: Uma coisa a notar, com isso, também, é que pode não funcionar como esperado se você usar um número negativo. Então negativo de 5% 4, algumas pessoas pode pensar que é - o que você acha negativo 5% 4 seria? COLUNA 5: Uma. JOSÉ: Então, algumas pessoas dizem que um, algumas pessoas dizem que uma negativa. Mas o que - ROB: Eu não teria sequer , disse um deles. JOSÉ: Dois, desculpe. Algumas pessoas dizem - ROB: Três. JOSÉ: Três? ROB: Negativo - qual era o - negativo de cinco - JOSÉ: Três, três, três. Desculpe. Porque modulo, em geral, quando você tem vi isso em outro lugar, isso normalmente significa retornar um número positivo, certo? ROB: Então, quando dizemos em matemática, 10% do, eles tendem a querer dar-lhe - se mod por 10, então nós esperamos obter um número entre 0 e 9. Em aqui, que não é o caso que você vai ter números negativos retornado. JOSÉ: Então negativo de 5% 4 seria negativo 1. ROB: Mas é raro que você é mod-ing números negativos, para começar. Ir isso. JOSÉ: É. ROB: Meh. OK. Assim, uma última coisa a salientar sobre flutuadores é que é um comportamento perigoso, mas carros alegóricos não são uma exata representação. Então, voltando para bytes de novo, lembre-se que um int é sempre quatro bytes e um flutuador é sempre quatro bytes. Assim, o exemplo de Lucas é muito bom. Então, acho que de 1 dividido por 3. Então 0,3333333. Se eu só tenho 32 bits, como pode Eu armazenar 0,33333 exatamente? E talvez, por alguma razão, você diz: tudo bem, bem, vamos apenas dizer que que este particular 1011001, vamos apenas dizer que deve ser 0.333333. Bem, você só tem um número finito de esses bits, por isso é impossível representar cada ponto flutuante valor dado apenas 32 bits. Bem, é impossível representar qualquer valor de ponto flutuante dado infinito - bem, dado qualquer número finito de bits. Portanto, a questão aqui é, bem, quando usamos para imprimir em duas casas decimais, que fizemos corretamente obter a resposta 0,10. Mas debaixo do capô, é realmente sendo armazenadas tão próximo quanto possível 0,10 como esses bits pode representar. É este no próximo slide? Ou não é? JOSÉ: Sim, é isso. ROB: Blegh, blegh. JOSÉ: Sim, você pode apenas puxar as notas para cima um pouco. ROB: Eu só vou para aumentar em no último nisso. Oh meu Deus, isso é [inaudível]. Assim que o número. Isso é o que será impresso se executar o programa. E note que não é realmente um grande negócio se estamos apenas se preocupar como 2-3 casas decimais. Como nós só originalmente impresso 0,10, e é por isso que não viu nada de errado. Mas uma vez que começamos a entrar no exato, número exato de que é representando, vemos que ele não pode exatamente representar 0,1. E parte do problema aqui é como, Tudo bem, tudo bem, mas, bem, primeiro, o que se tentou fazer, resposta é igual a igual a 0,1? É isso que vai retornar verdadeiro ou falso? E por isso é difícil de dizer. Eu acho que ele realmente pode retornar verdadeiro. Será que vai em primeiro lugar - Eu não sei. A resposta é uma vez que você começar a lidar com valores de ponto flutuante, você muito muito não deve estar usando a igualdade devido a esta imprecisão. E para tudo o que você sabe, é o centésimo casa decimal que o ponto flutuante não era capaz para lidar corretamente. E assim, a igualdade só vai falhar mesmo embora o número - se você tivesse sido usando números exatos, os números devem ter sido exatamente o mesmo. É ao longo de uns 50 Cálculos usando estes flutuante valores de ponto, o erro pode construir cima e para cima e para cima, e as coisas só ficam mal. JOSÉ: E houve realmente exemplos famosos de isso acontecer. Como os engenheiros da NASA ter começado esta erradas, causando foguetes para explodir em o ar depois de terem sido lançados. E muitas questões como essa. Então, sim. COLUNA 6: Quando você diz que 0,3 f, ele truncar o resto? Ou será que arredondar para cima ou para baixo? ROB: Será printf em volta dele? JOSÉ: Eu acho que trunca printf. ROB: OK. Assim, podemos ir da mesma forma no oposto direcção deste, onde, neste caso, o mais próximo que poderia representar 0,1 Foi com esse número. O mais próximo que pode ser capaz de representam 0,2 é o oposto direção, 0,199999996356 ou algo assim. Então, se nós fomos nessa direção de coisas, então printf 0,3 f retornaria 1,99 em vez de 2,00. JOSÉ: E eu não estou totalmente certeza sobre isso. Você pode querer escrever um pequeno, pouco programa para verificar isso. ROB: No entanto, o que temos certeza é de que se você tentou lançar isso para um int, e lançando para um int vai causar-lhe a truncar o decimal, se você tentar converter 1.9999999 para um int, você vai ter um. E assim, você deve geralmente usar o função round na biblioteca matemática. Dúvidas? OK. JOSÉ: movendo Assim, para condições e expressões booleanas. Então, você já viu isso antes. E, na verdade, deixe-me ter certeza que meu computador está no formato certo aqui. Espaço. Desculpe, nós vamos ter que lidar um pouco com corte nas bordas. Mas sim, vocês têm visto isso antes em Scratch. Então, isso aqui é uma expressão o qual é utilizado em uma instrução condicional. Então responda maior que zero vontade dizer verdadeiro ou falso. E estas são realmente importante, porque eles nos permitem introduzir lógica em nosso código. Assim, por exemplo, este é um programa escrito em Scratch que pede ao usuário para um inteiro e diz a eles se o inteiro que eles lhe deram foi uma número positivo ou negativo. E a conversão por aqui para ver se imprimir pela primeira vez a declaração, dê-me um inteiro. E então você pedir-lhes para um inteiro. E então você usa a lógica condicional sobre aqui para verificar se esse número foi realmente maior do que zero ou não. Portanto, temos aqui uma expressão booleana dentro de uma condicional Se comunicado. Existe alguma dúvida? Há alguma dúvida sobre isso? OK. Portanto, não há mais do que apenas maior do que, é claro. Você pode construir expressões booleanas usando a maioria dos tipos de coisas que você pensaria em matemática. Assim superior. Isso deve ser um menor que. Desculpe. E o espaçamento. ROB: Deus não permita que você deixá-lo. JOSÉ: Tudo bem. Assim, maior que, menor que, maior do que, ou igual a, menos do que, ou igual a. Usamos dois iguais para verificar se há igualdade, porque só é igual a meio atribuição, certo? Sim. E então nós podemos também não é igual por usando ponto de exclamação, é igual. E este símbolo ponto de exclamação pode também ser estendido, de modo que, se você quiser para inverter qualquer tipo de Boolean expressão, você pode fazer isso. Então, isso vai avaliar a verdade só se a resposta for menos que ou igual a zero. Qualquer dúvida sobre isso? OK. Então, você também pode combiná-las expressões usando lógica E e Ou lógico. Portanto, este é apenas o símbolo E, que deve ser Shift 7. E este é o símbolo pipe, que é não um caso menor L. É a única isso mesmo acima de sua tecla Enter. Então você usa dois destes para simbolizar lógico ea lógica Ou. Então, isso só vai retornar true se a resposta é um, dois, três, ou quatro. E isso só vai retornar true se a resposta está além de que em ambos os lados. Portanto, não é um, dois, três, ou quatro. E a maneira que você usaria que em uma expressão - ROB: Ou um zero ou um cinco. JOSÉ: Zero ou um cinco. Desculpe. Sim, sim, sim. OK. E aqui, agora, da mesma forma que usaria essa expressão, um menor lado de uma Se condicional expressão declaração, você também usaria o mesma forma, apenas colocá-lo dentro de dos parênteses da instrução If. Portanto, este printf só será acionado se a resposta é um, dois, três, ou quatro. Qualquer dúvida sobre a combinação expressões? Portanto, não há outra condicional construto que chamamos de If / Else. Então, basicamente, isso significa que agora, ok, se algo que eu queria ver não era verdade, então vá para o Else e realizar essa outra ação. Portanto, neste caso particular, eu perguntei o usuário para um número inteiro. É o número inteiro maior do que zero? Sim? Bem, então eles escolheram um número positivo. Se não, então ele deve ter sido negativo ou zero. Então você escolheu um número negativo ou um zero neste caso. Sim. Ou um zero. E depois também temos If / Else, Se e Else. Então, isso nos permite executar uma seqüência de coisas só se os primeiros falharem. Portanto, neste caso, agora nós estamos fazendo o último que você pegar zero. Então, se eles não escolheram um positivo nem um número negativo, então eles devem ter escolhido zero. Então, ele só vai para baixo da cadeia como esta. Assim, um exemplo de como um Se é diferente de - um If / Else é diferente de apenas uma seqüência de Ifs. E esta é uma pergunta comum que as pessoas perguntam é, bem, se você começa como um 95 em CS50, o que será este programa de te dizer? COLUNA 5: Você tem um A. JOSÉ: Sim. Você tem todos os um daqueles direita. Você tem um A, você tem um B, você tenho um C e um D, certo? Então, tudo isso se avaliou em ordem. Assim, enquanto uma 95 é maior do que 90, é também maior do que 80, é também maior do que 70, e é também maior do que 60. Então você tem todas essas qualidades. E eu suponho que você faria só quero o A. A maneira de corrigir isso é substituir aqueles com Else / Se 's. Portanto, neste cenário, ele vê que 95 é superior a 90, e, em seguida, faz não avalia o resto das declarações. Qualquer dúvida sobre isso? Portanto, há um outro tipo de condicional estrutura que nós temos aqui, que nós chamar uma instrução switch. Então, isso permite que você verifique basicamente qual é o valor de um número que você colocar para a instrução switch é. Portanto, neste cenário, estamos alternando em n, e nós estamos dizendo, oh, se n é um, em seguida, imprimir essa afirmação. E, em seguida, romper, o que significa que a saída fora da instrução switch. Se não fosse um, então, bem, apenas eventualmente verificar todos esses casos. E assim, ele verifica se é um ou dois ou três, e ela imprime em conformidade. E o que esta palavra-chave default aqui meios é se não entrar em qualquer desses, em seguida, dizer inválido. Então, digamos que eu peço e n o usuário dá-me quatro. Bem, ele corresponde a nenhum desses casos, por isso vai imprimir o que está no seção padrão. Sim, questionar? COLUNA 5: Pode-se usar Boolean em vez das expressões um, dois, ou três? JOSÉ: Então a questão é você pode usar Expressões booleanas em vez de um, dois e três? E em C, eu acredito em você Não posso fazer isso. Mas, em outras línguas, o que você pode encontrar no fim do semestre como JavaScript, você pode. Bem, você teria que calcular primeiro esse valor e, em seguida, usá-lo no instrução switch. Sim? ROB: Então uma parte do benefício do interruptor declarações é pensar se você fez isso como If / Else, assim como se n é igual a é igual a um, ou o que seja. Else / Se n é igual é igual a dois, que seja. Else / Se n é igual é igual a três. Assim, a forma como o programa seria executado é se sequencialmente descer essa lista e verificar, é n um? Não.. N é dois? Não.. É n três? É. Faça isso. Considerando que, com instruções switch, é realmente capaz de compilá-lo para ser muito rápido. E assim que ele diz switch, ele diz, tudo bem, n é dois, eu sou imediatamente vai pular para onde É que eu vou começar a executar. Eu não estou indo para a primeira verificação, n é um, é n dois? Pode começar imediatamente a fazer o que é suposto fazer. E por causa disso, não pode ter condições de booleanos. Ou então ele teria que fazer o seqüencial, como, tudo bem, é n maior do que zero? Else é n superior a 10 ou o que quer. JOSÉ: Neste caso, se você usou If / Else, de Se, em seguida, a chave seria executar cerca de três vezes mais rápido do que o If / Else, Se. Podemos organizar o interruptor de tal uma maneira que nós não quebrar após cada um dos casos. Portanto, neste caso, eu estou dividindo o números que escolhemos em um e dois que não números elevados e sendo três um número elevado. Portanto, neste caso, se n é um ou dois, vai bater o caso e, em seguida, ele vai cair, porque não há ruptura. E isso vai acabar aqui. Então, se nós escolher um, ele vai fazer o printf e, em seguida, quebrar, de modo que nenhum dos este é executado. E, claro, se eles entram em três ou qualquer outra coisa, então ele vai pular aqueles e não ir para lá, e executará em vez do linha correspondente. Há alguma dúvida sobre isso? Sim? COLUNA 4: Você obterá um erro se você teve uma pausa depois de um caso, mas não tinha algo para ele fazer? JOSÉ: Então a questão é que você começa um erro se você tem uma pausa depois maiúsculas de um, mas não há nada para fazer? E a resposta é não. Você não vai realmente obter um erro. Sim, hmm mm. Então, como uma espécie de uma pequena mudança aqui, Eu vou colocar um printf aqui. Gritos. Então, o que este impresso se Eu coloquei um em como entrada? É. Ele iria dizer-lhe não demorou um elevado número duas vezes, certo? Porque ele iria bater aquele primeiro caso, não iria quebrar, e cairia até o segundo caso. Qualquer dúvida sobre isso? ROB: Você tem outra pergunta? JOSÉ: OK, esfriar. Tudo bem. Portanto, não há outra coisa que chamamos de operador ternário que é basicamente um sintaxe alternativa para fazer Se e, em seguida, Else. E isso permite que você faça tudo em uma linha. Portanto, neste programa especial, Estou pedindo ao usuário para o n. E se n for maior que 100, eu digo eles escolheram um número alto. Else Eu digo a eles que eles escolheu um número baixo. Assim, podemos usar este tempo muito longo de sintaxe, corda, S, e em seguida, verificar se n é maior do que 100 e atribuir lo em conformidade. Mas podemos fazer isso muito mais concisa usando esta sintaxe operador ternário que envolve uma questão marca e um cólon. Assim, o ponto de interrogação é essencialmente fazer uma pergunta, certo? ROB: Talvez ampliar isso. JOSÉ: Sim. Bom ponto. Então este é o operador ternário. A primeira vez que fazer a pergunta, n é maior do que 100? Se for, então executar o primeiro parte antes dos dois pontos. Se não for, então eu executar o segunda parte depois dos dois pontos. Assim, se n for maior do que 100, em seguida, ele pega alta e puts que em cadeia s. Se n for menor do que 100, que escolhe baixa e, em seguida, coloca isso em cadeia s. Assim que condensa este grande pedaço para baixo em apenas que uma linha. COLUNA 5: Isso é popular? JOSÉ: Sim, é bastante popular para coisas onde essencialmente você deseja não uma atribuição com base em algum tipo de condição. E, neste caso, nós estávamos tentando para atribuir um valor a cadeia s. Não é assim - Eu acho que eu realmente não preferem nos outros casos. Mas é especialmente útil para esta tarefa. ROB: Isso é um padrão muito comum onde você tem alguma variável que você vai dizer, se algo, ajuste esta variável para um valor, senão, definir esta variável para outro valor. E esse é o cenário onde usar um ternário. JOSÉ: E você está economizando lotes de linhas, certo? E ele só faz o seu código indiscutivelmente um pouco mais legível. Sim, questionar? COLUNA 6: Para um ternário, você poderia ir, string s iguais s, ponto de interrogação? E então você pode ter, por exemplo, cinco opções diferentes. E, dependendo do que o número de n foi, você deve escolher um desses? JOSÉ: Então a pergunta é, existe um tipo de sintaxe onde você pode fazer corda s é igual a n, e, em seguida, ter mais do que dois opções depois que ponto de interrogação? E a resposta simples é não, não há realmente uma boa maneira de fazer isso, a menos você quer ninho ternário múltipla operadores dentro do outro. Você poderia fazer como n maior que 100, ponto de interrogação, e depois outro operador ternário, n superior a 50, ponto de interrogação, e aninhar-lo dessa forma. Mas, nesse cenário, o código é ficando meio ilegível e confuso, e talvez seja melhor ir apenas para uma instrução If / Else naquele ponto. ROB: E também, como uma nota lateral, PHP incorretamente implementa o ternário operador tal que ternários aninhadas nem sequer funcionam como deveriam. JOSÉ: É. Então, ele fica um pouco confuso, especialmente quando você vai para diferentes idiomas. ROB: É confuso o suficiente para que línguas estão errados sobre isso. JOSÉ: Então, na verdade, só para esclarecer, que todo mundo sabe o que isso % S faz aqui? Qualquer dúvida sobre isso? Eu acho que só para a câmara, o% s basicamente nos permite colocar um espaço reservado para uma string. E depois, no final, que especifica que o variável queremos colocar nessa titular lugar é s. Assim que, basicamente, tem s e coloca-lo aqui. E então ele vai imprimir, você escolheu um alto ou você escolheu um número baixo. OK. Então laços permitem que você execute as coisas em movimentos circulares, certo? Você pode ter encontrado isso em Raspadinha na forma de laços para sempre ou repetir até ou Repetir uma especial número de vezes. Então, por que isso é bom para nós? Bem, em C, vamos dizer que temos esta canção implementado em Scratch que canta, esta é a canção que nunca termina. Ele só vai sobre e sobre e para sempre e para sempre. Bem, você não pode realmente fazer um programa que tem um número infinito de printf declarações, certo? Portanto, neste cenário em particular, de uma forma que você poderia fazer este trabalho e para torná-lo imprimir sempre é em vez usar um loop While. Assim, um loop While irá executar o que é no corpo das duas cintas que pertence a ela com base no que é a condição. Portanto, neste exemplo particular, antes, se queremos imprimir isso para sempre, o que que podemos fazer? Bem, com certeza, não é? Portanto, este tipo de combina a idéia de alguma expressão booleana juntamente com um laço. E nós aprendemos sobre booleano expressões anteriores. Assim, sempre que a condição dentro de Enquanto isso continua a ser verdade, este laço executará sobre e sobre e sobre. E, neste caso, se nós apenas fornecê-lo com verdade, isso faz com que um infinito laço que imprime a canção sobre e sobre e sobre como nós desejado antes sem ter um programa que tem um infinito número de instruções printf, que é não é possível. Então, mais convincente, porém, você pode usar isso com um variável e uma condição. Então, vamos dizer que queremos repetir o frase, totalmente maluco, 10 vezes. Então o que você pode fazer com um loop While é primeiro você pode inicializar um contador variável fora do While a 10. E então, basicamente, cada vez que você vai através do loop While, você imprime a declaração e, em seguida, você diminui a contador variável até ao final, em algum momento, uma vez que eu subtrair o suficiente vezes, 1 da I bastante vezes - e só para esclarecer, eu minus minus Significa que é igual a que eu menos 1. Isso vai trazer basicamente I até o ponto em que uma vez que eu chegar a zero, este condição não é verdadeira e por isso sai fora do circuito. Então, totalmente maluco só imprime 10 vezes. Qualquer dúvida sobre um loop While? OK. Portanto, há uma maneira de fazer o que acabamos de fez de uma forma mais concisa com o que chamamos de um loop For. Então, um circuito para consiste numa inicialização, um estado, e um atualização, assim como tínhamos antes neste loop While. Então, vamos dar uma olhada. Neste loop While, tivemos um inicialização, então nós tivemos um condição de que fizemos o check. E então nós tivemos uma atualização pisar no topo. Com um loop For, isso leva basicamente essas três coisas e condensa-lo para baixo em uma linha. Então a primeira coisa que ele faz no Para loop é a inicialização. E então você faz um ponto e vírgula, e, em seguida, você faz a condição, o que é que eu maior que zero vai para lá, e, em seguida, a etapa de atualização. Portanto, este fica realizada no final do corpo do laço. Então, esses dois programas são essencialmente equivalente. Alguma pergunta? Então, o que é uma diferença entre esses dois? Alguém pode indicá-lo? Ele pode ser um pouco sutil. É apenas uma diferença muito pequena. Sim? COLUNA 5: Você não seria capaz de usar a variável I, fora do loop For [Inaudível]? JOSÉ: Exatamente. Então, isso é algo que nós vamos chegar a mais tarde chamado de escopo de variáveis. Mas, essencialmente, este int vida I fora desse loop While. Então, uma vez que este loop While é feito execução, eu vou ser capaz de usar, mais tarde, em no programa. Considerando que, com este loop, este int I tem como escopo dentro deste loop. E porque é dentro desta parcela do circuito para, que inicia nos parênteses e termina com a chaveta lá. Qualquer coisa que é declarada dentro de aqui não pode ser utilizado no exterior. Então, se eu tentar usar eu fora, ele vai diga-me, símbolo não declarado. E, essencialmente, eu não faria ser capaz de usá-lo. ROB: E bem, há 10 anos, em literalmente todos os casos, as chaves são o que você usou para determinar o escopo de uma variável. Então, lá dentro, int I é igual a 10 é declarada dentro deste conjunto de chaves. E então, enquanto você tentar usar I antes deste chaveta, tudo bem. Você pode ver quando você digita make, você ver traço, traço, std, iguais, c99. Então, essa é uma versão posterior do C que GCC implementou que também dá este atalho. Portanto, este utilizado para não ser permitido em C. E você pode ver por que, porque este int I está fora deste chaveta mas ainda é considerado no alcance dessas chaves. Mas isso é uma coisa muito conveniente, e por isso é uma boa extensão. JOSÉ: Alguma pergunta? OK. Então, o que é mais útil é que, por vezes, você quer tipo de dinamismo seu ciclo, certo? Você não quer apenas necessariamente imprimir totalmente maluco o tempo todo, você quero contar para baixo de 10 ou algo assim. E assim você pode usar a variável do contador dentro desse ciclo também. E, neste caso, este programa apenas contagem regressiva de 10 todo o caminho. E o que não imprime? Não imprimir zero, direito, porque quando - Sim, ele também não imprime 11. Por isso, não imprimir zero, porque quando Eu é zero, lembre-se, ele avalia a condição antes de entrar em para executar o corpo do loop. E quando eu for zero, isso é falso, assim não imprimir em contagem regressiva zero, ele só imprime contagem queda de 10 todo o caminho até a 1. Se nós realmente queria para imprimir zero, então poderíamos colocar um sinal de igual após este sinal de maior que. OK. Assim, uma maneira de fazer a validação de entrada, que é quando você pede que o usuário faça alguma coisa, você quer ter certeza de que eles seguir suas instruções, é usar o loop While, certo? Portanto, neste caso particular, eu estou perguntando para um número positivo e, em seguida, eu sou aguardando entrada. E então eu chequei Enquanto a entrada é menor que zero, continuo a perguntar-lhes. Então, enquanto eles me dão um número que não é positivo, continuo a perguntar, continuo a perguntar, continuo a perguntar. Mas o que é uma espécie de estranho sobre isso? Ou o que não parece ideal sobre esta estrutura aqui? Qualquer um? Sim? COLUNA 6: Você está repetindo a instrução de duas vezes. JOSÉ: Certo. Portanto, temos duas declarações printf aqui, certo? Portanto, há uma maneira que nós poderíamos conseguir isso apenas até um que faria o nosso código mais fácil de ler e um pouco mais limpo. E, então, não teria que Entre em ter duas vezes também. E uma forma de fazer isso é usando um loop do-while. E um laço do-while é basicamente um forma diferente de um loop While onde tudo o que está dentro de chaves é executado pelo menos uma vez. Então, aqui, eu declaro, int de entrada, do lado de fora pela primeira vez. E então eu acabei de dizer, fazer isso instrução enquanto a entrada é menor do que zero. Assim que atinge a fazer primeiro. Ele sempre irá executar isso pelo menos uma vez, por isso sempre vai pedir o usuário para a entrada de, pelo menos, uma vez. E, em seguida, ele avalia que a entrada, e se passa em um círculo. Sim, questionar? COLUNA 6: Existe uma maneira de fazê-lo [Inaudível] tipos, como se diz, GetString, e alguém [inaudível] existe uma maneira de [inaudível] JOSÉ: Então a pergunta é, existe um maneira de fazer a validação de entrada se o usuário não colocar na direita tipo de variável? Então, se nós pedimos para um int e eles dá-nos uma corda em seu lugar. E nas funções que implementam para você, GetInt, GetString em todos essas funções, eles realmente já fazer esse tipo de entrada de tipo básico validação sob o capô. Então, se você estiver usando as funções que lhe deu, você realmente não precisa. Mas se você quiser olhar mais para como você pode realmente fazer isso, você pode olhar sob o capô o arquivo I/O-- não apresentar, as funções de E / S padrão como uma leitura da entrada padrão e saída padrão. E você pode ter uma noção melhor de como você pode fazer isso. ROB: Uma questão, porém, é especificamente com o exemplo que você disse, você espera uma string e eu entrar em um int. Como você dizer a diferença entre intencionalmente querendo o corda 123 contra querendo int 123? Então corda, é praticamente não há nenhuma validação, é só o que eles entrou você vai interpretar como uma string. Int é mais fácil, porque não importa o entrada que você tomar a partir do usuário, você é sempre levando uma corda. E assim que a seqüência que você pode, então, verificar, são todos estes dígitos numéricos, na verdade? JOSÉ: OK. Qualquer dúvida sobre um loop do-while? ROB: Ah, e este é também - voltando ao escopo, um tanto comum erro está tentando usar alguns locais variável a partir desta do-while loop dentro desta condição. E na verdade, se nós apenas se livrou de isso e disse, a entrada é igual a int GetInt, em seguida, o compilador vai gritar com nos, porque a entrada não existe fora do âmbito da estas chaves. JOSÉ: E é por isso que preciso essa formação aqui. OK. Então, você também pode sair de um malha mais cedo se você quiser. Portanto, esta é uma forma diferente de implementar o que acabamos implementado. E em vez de usar a condição dentro dos parênteses, estamos usando um Se declaração dentro do corpo do loop do-while. E, basicamente, quando a entrada é finalmente maior do que zero, iremos sair do loop. E assim vamos todos o caminho até aqui. E você pode ver que esta seria provavelmente ser preferível neste cenário, porque é um pouco pouco mais limpo e um pouco pouco mais fácil de ler. Considerando isso, você espécie de ter linhas extra na mesma. É apenas um pouco mais feio, Eu acho que, de certa forma. Sim, questionar? COLUNA 4: Será que quebrar só começar lo fora de um conjunto de chaves? JOSÉ: Certo. Então a questão é só quebrar tirá-lo de um loop? E a resposta é sim. Então, se você tiver aninhado For loops, para exemplo, se eu tenho para int I é igual a 0 até o dia 10 e, em seguida, para int J é igual a 0 até o dia 10, se eu sair do interior loop, eu ainda irei para o circuito externo. Por isso, vou continuar realizando o operações do lado de fora. Qualquer dúvida sobre isso? Sim? COLUNA 5: Mas quebrar apenas as funções para chaves, não para o outro declarações? [Inaudível] JOSÉ: Então a questão é vai quebrar única função para loops em oposição a outras declarações, como se? E sim, esse é o caso, porque você está quebrando fora de um loop, direito, em um sentido. ROB: Na grande maioria dos casos, é este é o tipo de Se algo, em seguida, quebrar. Então você não tem que quebrar a aplicar-se Se o que está envolvendo em torno dele. E também, isso não é muito de um loop, mas lembre-se de que os interruptores são também quebrado de por pausas. Vimos breaks sendo usado com interruptores antes. JOSÉ: E você também pode usá-los em loops while e for loops. Alguma pergunta? OK. Assim, no próximo up é funções. Assim, você pode ter usado um destes BYOB blocos em seu projeto do zero. E isto permite basicamente definir um conjunto de instruções a serem seguidas. E o que quero dizer com isto é, vamos pensar de volta à matemática, à direita, álgebra. Você tem o que chamamos de uma função de x, alguma variável, e vamos dizer isso função é f de x é igual a x + 5. Então você pode pensar f de x como este preto caixa que leva 15 e, em seguida, produz 20. Assim, mais geralmente, é uma função algo que leva alguns insumos e em seguida, produz algumas saídas. E por que são funções bem? Eles são bons para uma série de razões. Assim é que alguém quer tomar uma facada o que significa organização? Em termos da razão pela qual as funções são úteis? Sim? COLUNA 4: Faz o seu código mais legível. JOSÉ: Certo. Então, uma das coisas é que faz seu código mais legível, certo? Em vez de ter como int x é igual a x vezes x vezes x, eu posso ter cubo de x, que é mais legível e mais compreensível para um leitor. Organização também é em termos de dividindo-se o seu código em gerenciável porções, de modo que, em vez de tentar implementar isso tudo em uma longa seção na principal, você pode classificar de dividi-la em como, OK, vamos escrever uma função ao cubo alguma coisa, vamos escrever um funcionar a quadratura algo. Dessa forma, você pode dividi-la em minúsculo, pequenas partes que você pode enfrentar ao contrário de tentar resolver um grande problema de uma só vez. ROB: Ou até mesmo pequenas, pequenas peças que você e um parceiro pode enfrentar. JOSÉ: É. ROB: Então, em vez de ambos Você está tentando implantar um funcionar ao mesmo tempo. JOSÉ: Simplificação. Alguém quer dar um palpite? Sim? COLUNA 5: Mais repetição. JOSÉ: Certo. Então, uma coisa que você pode fazer com simplificação é que ele é uma espécie de em no mesmo sentido como reutilização é que uma vez que eu escrever uma função cubo, eu posso é só usar que mais e mais e mais novamente no meu programa em vez de digitar x vezes x vezes x mais e uma e outra vez. E simplificação aqui também só significa que ele faz seu tipo de código mais fácil de depurar uma vez que você dividir este se em funções. Porque então você pode localizar onde seus problemas espécie de são. Alguma pergunta? Assim, uma outra idéia é abstração, certo? Esta caixa preta. Como você sabe o que faz GetInt para receber a entrada do usuário? Nós realmente não disse a você, certo? Tudo o que disse é GetInt faz exatamente o que diz que faz. Assim, mesmo que não lhe dizem como ele funciona, você ainda sabe. Portanto, neste caso particular, este é uma função quádruplo que faz coisas diferentes para uma entrada para produzir uma saída. E você pode quadruplicar um número pela multiplicação por quatro. Ou você pode o que nós chamamos bit transferi-lo por dois. E nós vamos cobrir este um pouco mais tarde. E não há necessidade de saber como esta função realmente funciona, desde que funciona como indicado. Assim, sob o capô, que eu poderia ser como, o retorno vezes entrada oito dividido por dois. E você não sabe, né? Tudo o que você precisa saber é ele faz o que diz. Então essa é a coisa útil cerca de abstração. E outra coisa é uma espécie de esta idéia de localizar o código para um especial seção. Então, se você tem um problema, você não tem que ir todo o seu código tentando para corrigir onde era o problema. Portanto, neste caso, eu implementei cubo errado. Pensei cubo foi multiplicando por três. Portanto, neste caso, este é um programa que acaba de multiplicar por três em todos os lugares. E há outro programa que tem cubo fatorados em uma função. E agora, se eu quiser corrigir o meu erro aqui, eu tenho que corrigir cada linha de código neste programa. Considerando, por outro lado, se eu usar o função, eu só preciso de mudar o que estava errado em um só lugar. Assim, em ciência da computação, que chamar entradas e saídas. As entradas são chamados de parâmetros ou argumentos, e as saídas são chamados valores de retorno. E vamos ver como isso nos ajuda a resolver de definir uma função em um segundo. Portanto, esta é uma definição de função para cubagem. Por isso, leva uma entrada, e, em seguida, ele retorna esse número vezes si três vezes. Então, vamos decompô-lo. Portanto, temos um cabeçalho de função, que consiste basicamente de três coisas. Portanto, temos os parâmetros, que são, como eu disse antes, o contributos para esta função. E então damos a função de um nome. Neste caso, ele é chamado de cubo. E, então, especificar qual o tipo de do valor de retorno é. Portanto, neste caso, a minha função cubo toma em um número inteiro e é também retorna um inteiro. Então, se eu passar em dois, dois é um número inteiro, ele retorna oito para mim, o que é um número inteiro. Então retornar parâmetros nome do tipo. Perguntas sobre isso? E, em seguida, o valor de retorno é realmente especificado no final dizendo retorno e, em seguida, retornar o que quer contém o valor de retorno. Portanto, neste caso, se colocarmos tudo em conjunto, uma função leva em parâmetros, é chamado de alguma coisa, e ele retorna algo que é do tipo que dizer que ia ser. Alguma pergunta? Então, como vamos usar uma função? Bem, nós escrevemos uma função e, em seguida, podemos usá-lo em nosso programa, certo? Então eu liguei para ele cubo, e então eu posso usar cubo. Mas o que é importante notar é que as questões de ordem. Se eu tiver cubo abaixo principal, é indo funcionar em cubo. E, neste ponto, não há nada chamado cubo no programa, e é só vai ser assim, eu tenho idéia do que é cubo. Então, ele vai dizer, implícita declaração de função. Esse é o erro que aparece. E assim, neste caso, o cubo está abaixo principal, por isso não está acontecendo para saber sobre ele. COLUNA 5: Assim principal é normalmente a última função definida? JOSÉ: Então a questão é, é o principal geralmente a última coisa que você definir? E não. É porque normalmente temos como principal para estar no topo, certo? Porque essa é a primeira coisa que você quer abrir o programador a programa para ver. E assim, como é que vamos resolver esta questão de nós quer principal para estar no topo, mas o funções que queremos, queremos que eles ser inferior a principal ainda ser capaz de usar los dentro de principal? Bem, nós usamos o que chamamos um protótipo de função. Então, o que um protótipo de função essencialmente se é que primeiro tem que a assinatura ou a função header do que queremos implementar para baixo aqui, e vamos colocá-la em o início de um programa. Portanto, neste caso, dizemos que, bem, mais tarde, no nosso programa, nós vamos fazer uma promessa para implementar esta função chamada int cubo, o que leva uma entrada inteira. Então, agora, porque isso está acima de principal, principal, ele vai dizer, oh, bem, mais tarde no programa, que vai ser lá para que eu possa consultá-la, então eu vou apenas deixá-lo passar por agora. E, em seguida, na parte inferior, implementamos cubo. E então principal será apenas dizer, bem, ele irá classificar de ligação estes dois símbolos em conjunto. E nós vamos cobrir o que isso significa mais tarde. E assim vai saber que este é o função cubo que ele deve usar. ROB: O [inaudível] sobre querer principal na parte inferior ou top, eu vi os dois. Há coisas que simplesmente gostam colocar principal na parte inferior. Mas uma vez que um projeto fica particularmente grande, geralmente principal está em um arquivo próprio. E nesse ponto, como o linha cubo int seria - dentro de stdio.h são um bando de linhas apenas como aquele int linha de entrada cubo int. E para que esses protótipos são coisas que você tendem a colocar em arquivos de cabeçalho, em Nesse ponto, não importa. Bem, não importa. Aqueles sempre ir no topo. E se principal não é um arquivo próprio, você não precisa se preocupar em colocar protótipos de funções individuais no arquivo. JOSÉ: E nós vamos chegar a isso um pouco pouco mais tarde, quando Rob começa a falar sobre a compilação. E assim também há uma diferença entre parâmetro e argumento. E parâmetro é apenas o que nós chamamos esses insumos quando definimos a função. E chamamos isso de um argumento quando realmente passá-lo para a função. Portanto, neste caso, este é um parâmetro, como dissemos antes. E quando nós realmente usá-lo de lá, cubo de x, então X em si é o que chamamos de um argumento ao cubo função. ROB: Então os argumentos de parâmetros são - há esta distinção, muito confundida alternadamente. Neste momento, para mim, é como um dos aquelas palavras que, quando eu vê-lo em o selvagem, eu não posso ajudar, mas imediatamente questão de saber se eles estão usando-o em no contexto correcto, porque o diferença é sutil o suficiente para que apenas todos tendem - Eu quase sempre digo argumento independentemente do que quero dizer. José; e funções também são úteis para o que chamamos de efeitos colaterais. Assim, uma função pode tomar nenhuma entrada, e ele também pode produzir nenhuma saída. Portanto, neste caso particular, eu sou definição de uma sub-rotina que não tem nenhuma valor de retorno. E, a fim de especificar que, utilizamos o que chamamos de um vazio aqui. E assim, o efeito colateral dessa função é que ele só imprime o material para a página. Na verdade, não tomar qualquer insumos, e isso não acontece realmente produzir quaisquer saídas. Mas isso pode ser útil no sentido se você quiser, por exemplo, debug algo em seu programa, se você quiser para escrever um pouco sub-rotina que imprime, vamos dizer, o conteúdo de memória ou algo assim. E assim, estes efeitos secundários são, por vezes, útil, fora do contexto só gostaria de entradas e saídas. Alguma pergunta? E para terminar este segmento particular, o que este programa faz? Eu vou dar a vocês um par de segundos para lê-lo. Em um nível muito básico, o que queremos dizer é que ele troca x e y, certo? Então, como muitos de vocês realmente pensam isso vai trocar x e y? Levante sua mão. Ninguém. OK. Quem pensa que ele vai não trocar x e y? E a soma de que era não o quarto inteiro. Por isso, algumas pessoas não tem certeza. OK. Isso é razoável. Então, vamos passar pelo que acontece quando você realmente chamar funções pela primeira vez em Para responder a esta pergunta. Então, isso é o que a memória tipo de parece. Este é mais ou menos como um modelo simplificado memória do que parece quando você executar um programa. Portanto, há algo chamado a pilha para baixo aqui e algo chamado de heap. E estes crescem em direção o meio de memória. Portanto, neste caso particular, quando você chamar uma função, ele é colocado na pilha. E então o que está contido no que função permanece no que chamamos de que stack frame da função. E assim, para obter um bom visualização de isso, vamos - por exemplo, tivemos a programa principal antes. E dentro do principal, que chamamos de cubo. Assim principal seria primeiro vão para a pilha enquadrar, porque é a primeira função que é chamado. E então, quando cubo é chamado dentro de principal, que é colocado no topo da principal dentro da memória. Então, o que você vai notar é que cubo tem os seus próprios parâmetros e sua próprios moradores. Então, quando você realmente passar alguma coisa para uma função, os parâmetros que ela se são cópias do que foi passado do principal. E a sorte de explicar isso, vamos caminhar por um programa. Portanto, temos a pilha, o que é apenas a parte da pilha. E o que nós fazemos é primeiro inicializar x e y de um e dois. Portanto, temos essas pequenas caixas. Eles estão sentados na pilha do principal enquadrar na pilha. Eles contêm um e dois. Agora chamamos swap. O que acontece é que passamos x e y em swap, e swap cria suas próprias cópias dessas variáveis ​​para usar dentro de seu quadro de pilha. Então agora lá, temos, um que contém o valor que tinha x e b, que contém o valor que tinha y. Então, um, dois. E você vai perceber que este é separado de x e y dentro do principal. Assim, temos agora criar um temporário variável contenha um. Nós definimos um igual a b, por isso mudanças de um para dois. E, então, definir b igual a temperatura, o que é um. E então agora vamos sair desta função. Quando você sair da função, o quadro de pilha fica retirado da pilha. Chamamos-lhe empurrar. Você aperta um quadro de pilha para a pilha e você pop se fora da pilha. E então o que acontece é que tudo o que Foi nesse quadro de pilha tipo de apenas sobe em chamas. E para que não mais existe. Mas o que percebemos? Nós nunca realmente mudou o valores de x e y, certo? Portanto, aqueles permaneceu local para principal. E, passando as coisas em troca, nós na verdade nunca mudou esses valores. E o que nós chamamos isso? Chamamos isso de passagem por valor. Assim, no C, quando você passa as coisas em funções, passa-los por valor e faz uma cópia deles para a função de usar. E nós vamos aprender sobre algo chamado passagem por referência mais tarde, mas isso é uma maneira que você pode resolver este problema. Mas não vai se preocupar com que até mais tarde. ROB: E na verdade, esse termo, que passa por referência, então C não tem sequer passando pela referência. C exclusivamente tem passagem por valor. Não importa o que você faz, você está sempre passando uma cópia de algo. É que, como eu meio que mencionei que antes com ponteiros e que uma string é realmente apenas quatro bytes apontando para um lugar na memória. Bem, se eu tiver essa string e é me dizendo que é onde a string - bem, se eu tiver esse ponteiro para este colocar na memória, então eu posso passar um cópia do ponteiro para uma função e que a função ainda sabe onde em memória que é. Então, esses dois ponteiros estão apontando para o mesmo lugar na memória, e é assim que nós vamos ser capazes para modificar as coisas para além da quadro de pilha atual. JOSÉ: Você quer fazer a compilação? ROB: Não, é 5:30. JOSÉ: OK. É 5:30. OK. Então, vamos cobrir a compilação eu acho que em a próxima seção, ou a sua seção líder vontade naquele ponto. E - ROB: Alguma pergunta? JOSÉ: Alguma pergunta? Sim? COLUNA 5: Usando cordas de CS50, qualquer funções que deseja usar para aqueles, que vai ser como funções C. CS50 não passou e fez qualquer adicional. ROB: Correto. Qualquer um dos C como [inaudível], você usaria aqueles em nossas cadeias. JOSÉ: E uma última coisa que eu quero menção é que nós temos um guia de estilo para esta classe. ROB: Ah, sim. JOSÉ: Então, se você veio de um programação fundo antes, você pode ter certas convenções quando você está escrevendo código como colocar chaves na mesma linha ou especial formas de recuar ou nomear suas variáveis. Nesta classe, queremos seguir um guia de estilo específico, apenas porque, Bem, se você sair e trabalhar em indústria, você vai ser esperado a seguir o guia de estilo da empresa em que você vai. Como por exemplo, o Facebook eu acho tem um tipo particular de nomear convenção. E há diferenças entre camelo variáveis ​​da carcaça e, assim como separando-os com sublinhados. E também, eu acho que o mais importante, como por exemplo, o recuo, certo? Nós chaves começar onde a condição, e eles estão na linha seguinte. E nós também colocar chaves em mesmo que seja apenas uma linha. E um monte de vezes, existem maneiras de fazer lo onde você pode deixar essas chaves fora se é apenas uma linha sob a instrução If. Mas nesta classe, queremos seguir um guia de estilo específico apenas para que você obtenha usado para esse tipo de coisa. ROB: Sim, e estilo dos anos 50 vai fazer cumprir este guia de estilo, e estamos vai usar estilo dos anos 50 para grau de seu código. Por isso, faz as coisas mais fáceis para nós e esperemos que não deve fazer coisas que muito pior para você, dada a estilo padronizado não deve ser tão irrealista. JOSÉ: E, finalmente, para encontrar o estilo guia, vá para manual.cs50.net/style. E sim. COLUNA 4: Você vai fazer valer quaisquer caracteres por linha? ROB: sim. JOSÉ: Desculpe, pessoal. ROB: Isso é como um dos únicos. Neste ponto, estou OK com 120. Eu estou bem com a dizer 120 caracteres por linha. Eu entendo que haja algum limite. Eu acho que 80 é tão pequeno, mas estamos aplicá-la. JOSÉ: Pessoalmente, eu acho que com C, 80 caracteres é mais OK. Uma vez que você começa a ficar para outro linguagens como JavaScript e PHP, e não de modo razoável apenas limitar -a 80 caracteres. OK. Bem, essa foi a seção de super. Alguém quer doce? COLUNA 4: Sim.