Hello World Como Você Nunca Viu! | Entendendo C

preview_player
Показать описание
Se você nunca viu C ou como um programa funciona de verdade no baixo nível, hoje é sua chance de ver todo o básico de uma só vez!

Vou desde tipos primitivos, strings, arrays, stacks, heap, alocação de memória, structs, até minimamente entender o que está por baixo do que você chama de linguagem "orientada a objetos".

ERRATAS

- em 00:06:50 falei errado o range de INT, o certo é de -128 a 127
- em 00:06:06 eu falei certo e deixei a correção escrita errada. 64 bits, se você não precisar, desperdiça 7 bytes
- em 00:40:54 eu falei que 255 bytes é 1/4 de 1 megabyte, mas é de 1 KILObyte.
- em 00:38:40 eu não sei como deixei passar, mas quando falo de passar o string pras funções `f1`, `f2` não está duplicando toda a string e sim a referência pra ela. Se fossem valores primitivos como `int` sim, mas array só o endereço duplica mesmo.
- 00:45:20 64-bits são 8 bytes, toda hora na minha cabeça fica "4 bytes", mas são 8

CONTEÚDO:

00:00:00 Intro
00:02:06 Strings
00:04:37 Inteiros
00:06:54 Two's Complement
00:09:22 BigInteger
00:10:45 Pré-Float
00:13:47 Floats
00:17:27 0.1 + 0.2 != 0.3?
00:20:37 BigDecimal
00:22:17 Arrays
00:27:48 1o Hello World
00:28:37 Endereços e Referências
00:36:02 Contador de Programas e Pilha
00:41:03 Recursão
00:42:54 Ponteiros!
00:45:29 2o Hello World (com ponteiros)
00:48:52 Structs
00:49:47 3o Hello World (com struct)
00:52:25 Referências a Funções
00:55:26 4o Hello World (com callbacks)
00:59:57 5o Hello World (pseudo objetos)
01:05:05 Conclusão

LINKS:

* C - Pointer arithmetic (C - Pointer arithmetic - Tutorialspoint)

Me siga nas redes sociais:

Рекомендации по теме
Комментарии
Автор

Você pode não saber, mas mesmo sem vender nenhum curso, você está melhorando muito a educação tec no Brasil.

pedroveloso
Автор

- "C nem é tão dificil assim..."
- HELLO WORLD DE 1 HORA !

luccasbrandao
Автор

Muito bom o vídeo!
Finalmente alguem que explica o que ta acontecendo, a maioria dos outros canais so fica comparando o "Hello World" em varias linguagens sem explicar nd.
Imagino que esse video vai ser usado por muitos estudantes como material de estudo (ICC1 na usp é isso ai + arquivos), entao fico preocupado pq tem alguns pontos que podem confundir os alunos nas provas, nao quero ser chato (ficar te corrigindo), só vou colocar eles aqui pra se alguem for usar isso, estar o mais completo possivel:
--- No video tem uma associacao bem forte entre ponteiros o heap (alocacao dinamica com malloc), mas qualquer variavel/struct/etc pode ser passada pra um ponteiro:
int x = 42;
int * y = &x;
--- Na parte de alocacao dinamica nao foi usado o comando free, hoje os computadores sao espertinhos e quando um processo morre o SO ja libera a memoria, mas o correto eh cada malloc ter um free associado (e se nao colocar o free na prova perde ponto):
int * x = (int *)malloc(sizeof(int));
...
free(x);
Nao liberar a memoria com o free eh conhecido como vazamento de memoria.
--- O correto pra main eh "int main()" ou "int main(int argc, char ** argv)"
void main() foi comum em alguns microcontroladores, mas o valor que a main retorna tem significado.
quando uma main "retorna 0" ("return 0;" ou "return EXIT_SUCCESS;"), o programa ta indicando que terminou de maneira normal.
o usuario pode retornar EXIT_FAILURE caso o programa encontre um erro, nao eh obrigatorio.
--- Apesar de em versoes mais recentes de C e C++ o return da main poder ser omitido, nao colocar "return 0" no final da main pode custar uns pontos na prova.
--- "struct->variavel" é equivalente a "(*struct).variavel"
--- Uma array (char nome[ ] = "joao") eh identico a (char * nome = "joao"). A array decai pra ponteiro.

--- Escrever "array[posicao]" eh o mesmo que escrever "*(array + posicao)".
Quando soma um ponteiro com um numero, nao eh uma soma comum, chamam de aritmetica de ponteiros.
O valor do ponteiro vai ser incrementado pelo tamanho (sizeof) do valor apontado pelo ponteiro. Eh um bait bem comum.
--- Pra fazer uma funcao que edita o valor de uma variavel, tem que passar a variavel por ponteiro. Passar por copia vc so vai estar editando o valor da copia.
--- Nao precisa complicar tanto a notacao dos callbacks, exemplo:
--- Um exemplo mais completo sobre callbacks, const, typedef e OOP em C:
--- Variaveis estaticas (declaradas com "static") podem simplificar muito o programa, e acabar com a necessidade de algumas variaveis globais ou locais.

--- Detalhes extras:
Sempre use flags de warning quando for compilar:
-Wall -Wextra -Wshadow
Elas ajudam a indicar coisas que podem estar erradas mas nao sao erros, como tentar printar um uint32_t como uint16_t no printf, ou usar uma variavel que ainda nao teve valor definido.
-Wshadow mostra quando uma variavel ta com o mesmo nome de outra que tbm eh acessivel naquele lugar (tipo variavel global).
Ja perdi um dia inteiro procurando um bug que tava acontecendo pq uma variavel na funcao tinha o msm nome que uma variavel na classe (C++), ai eu achava que
tava escrevendo na variavel da classe quando tava escrevendo na da funcao.
--- Se o seu codigo funciona sem otimizacao mas quando liga a otimizacao ele para de funcionar, provavelmente ele tem Undefined Behavior (comportamendo nao definido).
Exemplos disso sao escrever em ponteiro que aponta pra variavel que nao existe mais; pegar o endereco de uma variavel, converter pra ponteiro de outro tipo e tentar acessar; FAZER OVERFLOW EM SIGNED INTEGER. unsigned eh de boa.
O compilador assume que o undefined behavior nunca vai acontecer, e otimiza o codigo pra ir mais rapido. Comeca a aparecer erro magico.
Nao passe ponteiro de funcao como "void *", nem como qlqr outra coisa. Tem arquiteturas que tratam eles de maneira diferente, tipo IA-64.
--- Quando quiser debugar o codigo, pode usar otimizacao -Og, assim como -g3 pra ter mais detalhe de debug. Se for usar o GDB pra executar o codigo linha por linha e ver as variaveis, pode usar -ggdb3 no lugar de -g3. Pra versao final do programa substitua -Og por -Os, -O2 ou -O3.
--- Nao use a flag de otimizacao do gcc "-ffast-math".
Ja eh dificil lidar com os bugs que a gente cria, lidar com os criados por essa otimizacao ai n eh nd lgl.
--- Codigos otimizados sao muuuito mais rapidos que codigos de debug. O compilador olha coisas que podem ser removidas, como variaveis temporarias, atribuicao de valor pra mesma variavel 2 vezes seguidas, trechos de codigo que nao fazem nada. Tem muito mais coisas mas foge do escopo desse comment.
Ele mostra o que cada funcao esta virando de assembly
Tem uma opcao escondida que permite executar o codigo tambem

--- Quando for pesquisar uma flag do gcc no google, coloque ela entre aspas, pq o simbolo - indica pro google que eh pra excluir resultados com o que vem dps do -, o contrario do que queremos. Entre aspas pede um match exato do que ta dentro.
exemplo: gcc "-flto"

--- Pra encontrar vazamento de memoria e acesso a elementos depois do final de uma array e coisa assim, existe um programa chamado Valgrind, eh gratis e de codigo aberto, muito util quando o programa comeca a ficar grande.

Eu mesmo nao sigo ele todo, mas tem umas coisas interessantes que ajudam a escrever codigo melhor.

Boa sorte ai a todos que estao fazendo trabalho ou vao fazer prova usando C!

yagomello
Автор

Eu cometi alguns erros que passaram batido. Desculpem por isso. Estou colocando nas Erratas na descrição. Vejam se já não está lá antes de comentar.


Akitando
Автор

e o Akita trouxe o primeiro vídeo do YouTube que é melhor assistir em 0.75x

gabrielcasseb
Автор

Akita, resolvi entrar na área já próximo dos 40 anos, em boa parte graças à sua famosa série de vídeos. Segui seu conselho e fugi de cursos "receita de bolo". Estou cursando, online, o CS50 de Harvard (introdução à ciência da computação). Lá, estou há semanas a fio aprendendo a RESOLVER PROBLEMAS sozinho usando a linguagem C. E, justo nesta semana, estou aprendendo a criar filtros para imagens .bmp utilizando, justamente, a lógica do salsichão de bytes. Imagine a minha alegria ao abrir este seu vídeo e ENTENDER cada palavra do que você estava falando. Me fez sentir que estou no caminho certo. Te agradeço por toda a ajuda motivacional que o seu canal está me dando. Um grande abraço!

andrekleine
Автор

When I find my code in tons of troubles, friends and colleagues come to me, speaking words of wisdom: "write in C".

mfrdbigolin
Автор

Quando eu fazia BCC na USP de São Carlos não simpatizava com a linguagem C. Eu tinha muitas dificuldades de entender o funcionamento da linguagem como um todo, os professores me diziam do poder da linguagem, porém para mim era uma linguagem como qualquer outra. No último ano do curso consegui um emprego na FacTI, uma fundação de tecnologia que prestava serviços para a Itautec. Foi nesta experiência que entendi o poder da linguagem C na prática. Trabalhei com verdadeiros monstros na programação, entrei num grupo de 10 programadores que programavam o PDV das lojas Fnac. O programa era "codado" em visual e compilado no Linux. Fazíamos ele conversar com o PinPad, monitor touch e a impressora, tudo por código C. Resumindo vi o verdadeiro poder da linguagem C. E digo mais, vi códigos neste projeto que nunca vi no curso de computação e nunca vi algo parecido procurando na Internet. Resumindo: foi a experiência mais enriquecedora que eu tive na minha vida de programador.

MsBottura
Автор

Lembrei da minha prova final do primeiro semestre na faculdade. Escrever um código em C que calcularia duas notas de um aluno e retornaria a média final e se ele estava aprovado ou reprovado. O professor foi testar e das cinco vezes que ele fez a inserção das mesmas notas foi uma média diferente, e só um dos testes a média estava correta. Ele olhou pra mim, olhou pro código, olhou pra mim de novo e disse; "nem vou perder meu tempo de olhar a magia que você fez aqui, mas como deu certo em uma das tentativas eu vou te aprovar. Pode ir embora e feliz Natal." hahahaha

SoldierDan
Автор

O Akita é tão foda que da até orgulho de ser Brasileiro.
Vc está fazendo mais por nós que muito curso (inclusive gringo).
Parabéns e muito obrigado!

victorbarros
Автор

Filosofia: entendendo-se
Computação: entendendo C

edupazz
Автор

Estudei C por um tempo e esse foi o melhor vídeo que vi sobre o assunto, principalmente a parte dos pseudo-objetos!

davidossantos
Автор

Quando algum leigo ou curioso te perguntar como os computadores funcionam, dê a melhor e única resposta que importa conforme nos ensinou o poeta e mestre Akita: "- Tudo é um linguição de bits!" 😁

rodstech
Автор

Eu realmente estou impressionado por ter entendido uns 90% do vídeo, o que significa que fui um pouco produtivo no último semestre da faculdade. Agora, "implementar" o conceito de P.O.O em C foi muito louco, mesmo tendo noção de que isso poderia ser feito, mas nunca tive ideia de como fazer com que as structs tivessem métodos próprios e nem passou pela minha cabeça em usar referência de funções para isso. Isso que é aula. Agora, é estudar mais e rever o vídeo para entender os outros 10%. Valeu Akita.

andre.gabriel
Автор

Tô maratonando a playlist e amando os vídeos. Por favor, não pare de trazer esse conteúdo importante e gratuito aqui pro BR. Sei que faz anos de lançamento do vídeo, mas se alguém estiver vendo esse comentário, gostaria de fazer uma "correção" (as aspas farão sentido mais a frente) ao Akita quando ele fala sobre inteiros em C, e adicionar um pouquinho da minha experiência da linguagem também para os mais entusiastas. Primeiramente o ponto que quero corrigir é sobre o intervalo de um inteiro: no exemplo dado de um inteiro com sinal de 8 bits, os valores vão de -128 a 127, e não de -127 a 128 como no vídeo, mas isso se o compilador utilizar o complemento de 2 como forma de armazenamento de inteiros. Isso fica bem claro quando tentamos usar um `char` para printar o caractere de número 128 da tabela ASCII extendida, que vai de 0 a 255, utilizando um total de 8 bytes e não 7, e recebemos um erro, mas ao utilizar um `unsigned char`, eliminando o bit de sinal de um `char` padrão, o código funciona perfeitamente. Agora a parte mais detalhada da linguagem em si: o padrão de C não estabelece ainda uma maneira de como o compilador deve armazenar o inteiro na memória, apesar de estar sendo fortemente cogitado para o padrão ser complemento de 2 na próxima versão de C (a versão atual, no momento desse comentário, é c17). Dito isso, os compiladores atualmente podem armazenar os inteiros da forma que preferirem, o que pode levar a você achar que 128 cabe em um inteiro de 8 bits, mas não cabe porque o seu compilador usa complemento de 2, indo só até 127. O Akita, na realidade, está certo se for considerado um método que usa inteiros indo de -127 a 128, e eu não lembro agora qual é o nome desse tipo de transformação. Na prática não se aplica tanto, já que os compiladores atuais mais utilizados (gcc e clang) usam complemento de 2, e provavelmente algum compilador menor que você talvez tenha que usar, também deve o fazer. Outro fato importante é que inteiros com sinal são sempre armazenados convertidos (em complemento de 2, por exemplo), independentemente de serem positivos ou negativos.

frango_molhado
Автор

Você vê, que o seu fim de semana vai ser bom, quando você acorda com um novo vídeo do Akita.

grpineiro
Автор

56:25 ponteiros de função, magnífico! Salva muitas linhas de código desnecessárias. Essa aula teve um resumão de tudo o que *eu* aprendi no primeiro semestre de curso, não foi a faculdade nem professores, pois nem abordaram ponteiros.

ProfAMuniz
Автор

Que vídeo sensacional. Já vi todo esse conteudo na faculdadde, mas hoje com 2 anos de experiência assisti esse video e fiz execicios quase que só pela nostalgia, a visão sobre o código é extremaente diferente! Valew

elissonlima
Автор

Esse foi o primeiro vídeo do canal que eu assisti quando iniciei meus estudos em CC pela UFSM na primeira metade de 2021. Lembro bem, eu estava fazendo meu intervalo no meu emprego tipo Mcdonalds na praça de alimentação do shopping. Enquanto meus colegas de trabalho estavam jogando conversa fora eu me escondi para estudar, para procurar o que estudar na verdade, por que eu nem sabia por onde começar, e caí nesse vídeo.

Na época pensei, fodeo, eu nunca vou aprender o que esse cara ta falando. Até aquele momento eu usava computadores somente para jogar e acessar a internet etc. Hoje +2 anos depois, no 6º semestre e estudando pra caramba paralelamente, assistindo novamente entendo todos os conceitos de boas, mesmo não sendo um programador de C, longe disso.

Consegui um estágio na área (não de programação, mas generalizando, de TI) depois CLT e sigo estudando.

Valeu Akita, muito do meu aprendizado foi com a sua ajuda. E eu tento ajudar compartilhando esse conteúdo com meus colegas, apesar de não assistirem.

mateuspaimdebarros
Автор

Não tem como, Fabio Akita apresenta o melhor conteúdo sobre computação que existe na internet em português.

kuryart