Seria interessante reforçar que include é uma diretiva de pré-processamento
.
Só "diretiva" fica vago.
stdio.h é um arquivo de cabeçalho, não uma biblioteca.
Bibliotecas são binários compilados.
Cabeçalhos no geral contém somente declarações de estruturas ou funções e aí durante o processo de compilação que as respectivas bibliotecas são linkadas.
Em tipos de variáveis seria interessante deixar mais claro a definição de double.
"ponto flutuante de precisão dupla", por exemplo.
Na parte sobre caracteres de escape seria bom envolver eles com aspas para que a barra invertida de escape não suma em alguns dos exemplos.
Sem aspas: "
Com aspas: \"
O mesmo problema ocorre em outros lugares, como na seção de testes e comparação e na explicação de strcmp
.
Na parte sobre associatividade faltou fazer a distinção entre pré-incremento/decremento e pós-incremento/decremento.
++
e --
só tem associatividade da direita para a esquerda se forem pré-incremento/decremento.
Quando são de pós-incremento/decremento, não só a associatividade é da esquerda para a direita, mas também têm precedência sobre pré-incremento/decremento. Estando no mesmo nível do operador de chamada de função.
Como já mencionaram no Discord, em "Referências e vetores" o printf está errado.
Não se usa & no printf, a menos que você queira imprimir o endereço da posição e não o valor dela.
Sua declaração de matriz tem três erros também:
- Não se separa linhas com
;
, mas sim com ,
- Sua matriz tem 2 linhas e não 3
- Falta ; no final
Original:
float matriz[2][5] = { {1, 2, 3, 4, 5}; {1, 3, 7, 8, 9}; {6, 5, 4, 7, 1} }
Correto:
float matriz[2][5] = { {1, 2, 3, 4, 5}, {1, 3, 7, 8, 9}};
Na parte de funções, tecnicamente você usou de exemplo uma definição de função, não uma declaração.
Claro, uma definição automaticamente também a declara, mas é possível também apenas declarar sem definir:
#include <stdio.h>
// protótipo da função
int duplica(int numero);
int main(void)
{
printf("Dobro de 2 = %d", duplica(2));
return 0;
}
int duplica(int numero)
{
return numero * 2;
}
Então para declarar uma função basta:
tipo_de_retorno nome_da_funcao ();
E para fazer um protótipo:
tipo_de_retorno nome_da_funcao (lista_de_parametros);
Em C a lista_de_parametros
teoricamente não é necessária na declaração, contudo, se não definir a lista, o compilador não poderá checar se os tipos, ordem e quantidade de argumentos estão corretos quando encontrar uma chamada da função.
E aí que vem a diferença entre declaração e protótipo.
Protótipo é quando você especifica todos os argumentos e declaração quando só coloca os parênteses sem especificar os parâmetros.
Por não fazer muito sentido declarar sem a lista de parâmetros, acaba que no geral as pessoas acabam usando os dois termos para se referir a um protótipo de função.
Na parte de leitura de strings o comentário sobre o scanf está errado.
Isso de "só recebe uma palavra" é por utilizar %s
e não limitação do scanf, vc poderia ler uma linha inteira assim:
scanf( " %[^\n]", variavel );
O outro erro está no "não controla a quantidade de caracteres recebido".
Isso também não tem nada a ver com o scanf, mas sim com usar %s
sem especificar o limite. Exemplos:
char variavel[40];
scanf( " %39s", variavel ); // le uma palavra, limitando em 39 caracteres
scanf( " %39[^\n]", variavel ); // le a linha inteira, limitando em 39 caracteres
(tem que usar tamanho-1, pois o \0 não entra no cálculo do scanf)
Seria até bom remover a parte sobre gets
, seu uso é mal visto e desencorajado.
Na parte sobre o fgets
está errado o comentário sobre "tamanho - 1".
O que se passa para fgets
é tamanho
mesmo, a própria função irá ler só até tamanho - 1
.