Olá, seja bem-vindo de volta.
Nesta palestra, eu quero falar sobre a definição de funções em c.
Definindo uma função.
Sabemos a importância das funções.
Compreendemos as vantagens.
Vamos querer usar funções em nossos programas.
Então, quando você cria uma função profissional em c, você deve especificar o
cabeçalho da função como a primeira linha da definição da função.
Vamos falar sobre como definir uma função e também falaremos
sobre a implementação de uma função.
Implementando uma função é apenas solução de problemas,
é apenas código C normal.
Definir uma função é dizer que a função existe.
Então, quando você define uma função, o a primeira coisa que você
faz é ter aquele cabeçalho de função e então seguir isso com uma chave que inicia o código
de bloco para a função.
É como quando você usa um chave em uma
instrução if, assim como quando você usa uma chave em um loop for, exceto que a chave
é necessária para as funções.
Não há como eliminá-lo.
E sempre significa o começo do código para essa função.
Qualquer coisa entre o início e a chave final é o código
para a função.
É para onde você está indo para implementar a tarefa.
Então, entre as chaves está chamado de corpo da função e a primeira linha
da função é chamado de cabeçalho da função.
O cabeçalho da função define o nome da função, os
parâmetros da função.
Vamos falar sobre parâmetros e argumentos em detalhes.
Mas agora, você apenas precisa saber que existe
algo chamado parâmetros.
E o parâmetro vai especificar o número e os tipos de valores
como você pode passar dados, parâmetros tem a ver com a passagem de dados.
O tipo do valor que a função retorna.
Mencionamos que funções podemos retornar dados.
Então, nesse cabeçalho de função, você terá
o nome da função, os dados que você pode pegar pode ser aceito pela função
e pelos dados que é retornado pela função.
Não vamos nos concentrar agora nos dados que podem ser passados ou nos dados
retornados, vamos apenas falar sobre a criação de uma função simples.
O corpo da função contém apenas código normal, e esse código é executado
quando você chamar ou invocar a função.
E o próprio corpo de função terá acesso a quaisquer valores
passados como argumentos.
Então, os dados que você passa para , você pode utilizar esses
dados dentro do corpo da função.
O que parece é este, o cabeçalho da função.
O cabeçalho da função tem a primeira palavra.
E o cabeçalho da função é um palavra-chave que representa o tipo
de dados que será retornado da função.
A próxima palavra-chave que existe o nome da função.
E então você tem um parêntese esquerdo e então você tem parâmetros separados por vírgulas,
que serão os dados que é passado para a função.
E então você tem isso parênteses à direita para
encerrar o cabeçalho da função.
Então você tem a chave que significa o início da
implementação da função.
E você tem qualquer número de declarações para fazer uma tarefa.
Como eu disse voce quer ter suas funções pequenas.
Eles querem ser coesos.
Eles não querem ser por todo o lugar.
Eles querem ter um único foco, faça algo específico.
Como eu disse, se você tem uma função que obtém a entrada, ele lê a entrada.
Não imprime saída.
Não faz nenhuma classificação ou não faz mais nada.
Se você tem uma função chamada classificar, ele classifica os dados.
Não recebe entrada.
As funções precisam ser coeso e pequeno.
É muito mais fácil depurar aqueles funções, para torná-los coesos.
E então você tem esse direito chave, que termina
a implementação da função.
Isso é o que uma função parece em c.
Agora vamos nos concentrar na função nomes, e falaremos sobre os parâmetros
e tipos de retorno mais tarde.
A primeira linha da função novamente definição diz ao compilador em ordem da
esquerda para a direita três coisas sobre a função, como mencionei.
O tipo de valor retorna, o nome da função e, em seguida,
todos os dados necessários.
Isso é apenas para resumir, isso é importante.
No que diz respeito aos nomes das funções, você deseja para escolher nomes de função significativos.
É tão importante quanto escolher nomes de variáveis significativos.
Isso afeta muito o legibilidade do programa, portanto, não
nomeie as funções x ou y.
Nomeie a função com base sobre o que vai fazer.
Se estiver adicionando dois números, nomeie-o adicionar.
Se estiver subtraindo dois números, nomeie-o subtrair.
Neste exemplo, aqui está nossa função simples.
Não se preocupe com o vazio, apenas se preocupe com o nome aqui.
Nós temos uma função mensagem de impressão nomeada.
E então vemos que a chave o
que significa o início da função, e então temos alguma implementação.
E esta implementação não está fazendo nada mais
do que exibir uma string, um texto.
E então temos isso chave direita.
Portanto, esta é uma função muito simples não faz muito, ele exibe a saída.
Neste exemplo para a impressão mensagem, a primeira linha
da mensagem de impressão diz ao compilador que a função não retorna nenhum valor.
Essa é a palavra-chave vazio.
Novamente, não precisa se concentrar em isso, mas é isso que está fazendo.
O próximo é o nome.
E depois o nome é argumentos, eles são chamados de parâmetros.
E usamos a palavra-chave vazio novamente se não estivermos passando nenhum dado.
A declaração na função o corpo pode estar ausente, mas as
chaves devem estar sempre presentes.
Então você não precisa ter nenhum implementação, mas você precisa ter as chaves
para que uma função esteja lá.
Se não houver declarações em o corpo de uma função, o tipo
de retorno deve ser nulo.
E novamente, vamos nos concentrar nisso mais tarde e a função não fará nada
porque você não tem implementação.
Se você definir uma função com um corpo vazio, ainda pode
ser útil, embora seja não realizando nada.
Você geralmente faz isso durante o fase de teste de um programa muito grande.
E o que isso permite que você faça é que você pode
executar o programa apenas com certas funções, na verdade fazer algo, ajuda
a testar melhor, ajuda a isolar erros.
Você pode até ter implementação no teste no corpo
da função, mas apenas comente.
E então você pode fazer isso abordagem dividir e conquistar.
Conforme você testa mais e mais e mais, você pode então começar a colocar a
implementação nos corpos das funções.
É um passo a passo processo de trabalho.
Você está constantemente trabalhando em pequenas pedaços, adicionando código, testando esse código e, em seguida, passando para o
próximo etapa e então, eventualmente, toda a implementação será
concluída e todas as funções serão implementadas.
Portanto, há um caso de uso para ter um corpo
de função sem código ou comentado.
Funções de nomenclatura.
O nome de uma função pode ser qualquer nome legal.
Assim como quando você está nomeando uma variável, você
não pode usar palavras reservadas.
Então, essas são palavras-chave no linguagem como enter doubles porque
representam tipos de dados.
Sizeof é um operador.
Você quer ser capaz para usá-lo para ou se.
Você também não poderia ter dois funções com o mesmo nome.
E isso também é referido para sobrecarregar a função, mais ou menos.
Mas você não pode ter duas funções com o mesmo nome, a sobrecarga não
é suportada em c.
Por último, você pode ter o mesmo nome como uma função que está na
função de biblioteca padrão.
Tecnicamente, se você não incluir essa biblioteca inclui o arquivo de cabeçalho,
você pode tê-lo.
Mas se você sempre quis realmente usar essa função de biblioteca, o compilador
reclamaria e diria que você duas funções com o mesmo nome.
Portanto, não nomeie suas funções como mesmo que funções de biblioteca padrão.
Um nome legal é o mesmo que uma variável, uma sequência de
letras e dígitos para começar.
O primeiro caractere tem que ser uma carta e a letra pode ser um sublinhado.
Você não pode iniciar funções com números ou qualquer tipo de
caracteres estranhos.
O nome que você escolher deve ser significativo e relevante para o
que a função faz.
Eu já disse isso, estou repetindo para dar ênfase, nomes significativos
são muito importantes.
Você frequentemente definirá a função nomes e nomes de variáveis também que consistem
em mais de uma palavra.
Então agora eu quero conversar um pouco um pouco sobre apenas o estilo de codificação.
Você provavelmente já percebeu quando eu escrevi meu código que eu uso a caixa de camelo.
Existem três maneiras diferentes você pode escrever os nomes de
suas variáveis e funções.
Você pode separar cada uma das palavras em um nome de função
com um caractere sublinhado, é uma abordagem.
Você pode colocar a primeira letra em maiúscula de cada palavra
ou você pode colocar palavras em maiúscula após a primeira palavra, e você ainda dedilha juntos.
Lembre-se, você não pode tem espaços entre eles.
Esta é apenas uma abordagem para nomenclatura porque
é importante que você siga algumas convenções para que seja mais fácil de ler.
Apenas tendo uma longa palavra com cinco palavras diferentes.
Então, se você tivesse uma função que diz verifique se há entradas válidas, você não
gostaria de ter tudo em minúsculas.
Seria muito difícil de ler e identificar onde as palavras estavam.
Então, a caixa de camelo é uma maneira de identifique onde as palavras estão em muitas
palavras e é fácil de ver o que essa função está fazendo.
Um sublinhado é outro maneira de separar palavras.
E capitalizando a primeira letra de cada palavra é outra maneira de separar.
É importante ser capaz de separe as palavras em uma função para
torná-la mais legível.
Eu geralmente uso o estojo de camelo.
E quando você usa um destes convenções, você deseja usar para
tudo, você deseja usar para nomear variáveis, você deseja usá-lo para
os nomes de suas funções.
Normalmente, você apenas segue este convenção de codificação comum, torna as
coisas mais legíveis.
Protótipos de funções.
Falamos sobre como definir uma função.
Que tal declarar uma função.
Você pode dizer por que você precisa declara uma função, você não está
declarando quando você a define.
Mas também há um conceito de declarar uma função.
E é necessário se você quiser para usar a função antes de ser
implementada, antes de ser definida.
Portanto, um protótipo de função é um declaração que define uma função.
Diz ao compilador essencialmente todos os detalhes da função.
Ele define seu nome, tipo de retorno e o tipo de cada um de seus parâmetros.
Portanto, parece um cabeçalho de função.
Ele fornece todos os recursos externos especificações da função,
principalmente você provavelmente também ouviu o termo assinatura, assinatura de função
é o que é.
Ele especifica os dados retornados, os dados que leva
e tudo sobre a própria função.
Você quer escrever um protótipo de função da mesma forma que você escreve o cabeçalho da
função, a única diferença é que você coloca um ponto e vírgula no final.
E isso é apenas declarando a função.
Isso quer dizer que a função existe.
Um protótipo de função permite o compilador para gerar as instruções
apropriadas em cada ponto onde você chama a função.
Ele também verifica se você está usando o funcionar corretamente em cada invocação.
A razão pela qual você fornece função cabeçalhos é para que você possa invocar a função
sem um aviso ou um declaração da função sem que seja implementado, então é realmente apenas a
ordem do seu código e darei um exemplo
disso em um segundo.
Quando você inclui um cabeçalho padrão arquivo em um programa, o arquivo
de cabeçalho adiciona o protótipo da função.
Os protótipos de funções geralmente vão em arquivos de cabeçalho se desejar reutilizá-los em muitos
arquivos de origem diferentes.
Se você estiver usando-os apenas em um arquivo de origem, você pode simplesmente
colocá-los no topo do arquivo de origem.
Mas porque estamos usando o printf função que pode ser usada em
muitos arquivos de origem diferentes, esse cabeçalho a função será definida no cabeçalho
ou na declaração da função será definido no cabeçalho.
E, neste caso, stdio. h.
Então, eles geralmente aparecem em arquivos de origem se apenas esse arquivo de origem
estiver usando essa função.
Caso contrário, você os coloca em um arquivo de cabeçalho se
eles estiverem sendo reutilizados por muitos arquivos de origem.
Ele permite qualquer uma das funções no arquivo para chamar qualquer uma das
funções que são definidas, independentemente de onde você colocou a implementação.
Se você colocar a implementação de uma função, depois de chamá-la, c vai
reclamar e dizer que não sabe sobre isso.
Porque quando você compila, você está compilando linha por linha.
Se você colocar a declaração em a parte superior, então você pode invocar
a função antes de ser definida, antes de ser implementado.
Os nomes dos parâmetros não precisam ser o mesmo usado na definição da função.
Você pode ter nomes diferentes.
Quando digo nomes, esses são os identificadores dos dados.
Você pode alterar o nome do parâmetros no protótipo da função.
Você ainda precisa ter os mesmos dados tipos, mas você pode alterar os nomes.
É sempre uma boa prática para incluem declarações de função
para todas as funções em seu programa na parte superior do arquivo.
Isso mantém seu programa mais consistente ao design e evita a
ocorrência de erros em qualquer fase se você quiser chamar essa
função antes de implementá-la.
Aqui está um exemplo de alguns protótipos de função.
Bem no topo do arquivo, temos nossos includes.
E então temos alguns funções que declaramos, calculamos a
média, somamos e obtemos dados.
Você percebe que parece apenas como um cabeçalho de função.
Tem o tipo de retorno, tem os parâmetros que são
definidos na função, mas tem um ponto e vírgula no final.
Não há implementação para essas funções.
Você está apenas dizendo ao compilador esta é a função existe e é
assim que ela é definida.
O que isso permite que você faça é agora em sua função principal, você
pode chamar a média, você pode chamar a soma, você pode ligar para obter dados.
E as implementações reais podem esteja abaixo de onde você está chamando.
Se você não tivesse a função cabeçalhos aqui, quando
você tentou chamá-los no principal, se eles fossem definido abaixo da rotina principal, você
teria erros ou avisos.
Então vamos dar uma olhada nisso em blocos de código.
Aqui temos nossa rotina principal usual.
Agora vamos dizer que queremos para criar uma função ou queremos invocar uma
função.
Vamos invocar um chamada add e não vai
usar nenhum parâmetro.
Estamos chamando isso em nosso função principal na linha 7.
Estava indo para implementá-lo na linha 10.
Vamos dizer void add e nem mesmo vamos fazer nada.
Vamos apenas mantê-lo vazio.
Quando vamos compilar isso, o que você vai notar se este compilador apenas
dá um aviso.
Diz que add tem um declaração implícita.
Você pode se livrar desse aviso usando uma declaração de função.
Você pode declarar a função para cima basicamente dizendo ao compilador que você vai use-o
em algum lugar, mas você não sabe
onde está a implementação.
Então, o que você pode fazer é diga void some aqui e apenas
adicione o ponto e vírgula.
Agora vai se livrar disso aviso e algumas compilações irão realmente
apresentar um erro.
Agora, quando eu compilar, eu tenho sem avisos e sem erros.
Então é isso que uma função declaração sim.
Permite que você coloque a função em qualquer lugar.
Agora, se você não tinha a função declaração no topo e você teve
a implementação acima, onde você o estava chamando, então você também não verá
o erro porque o compilador saberá sobre a função antes
de realmente tentar invocá-la.
Então, se construirmos isso, você também vai ver que não há erro.
Agora eu mencionei que você normalmente deseja declarar todas as suas
funções no topo apenas para boas práticas e acho que você precisa fazer isso.
Então continue fazendo isso.
Mas se você sair disso hábito, você deve declarar suas funções
antes de chamá-las ou você tem que fornecer protótipos
de função porque você não quer avisos ou erros em seu programa.
É assim que você pode definir um função, e é assim que você
pode usar protótipos de função.
Na próxima aula, vamos
falar sobre parâmetros.
Como você pode passar dados para uma função.
Obrigada.