Brincando com C, edição &((int*)-8)[3]
(lcamtuf.substack.com)- A quarta parte da série sobre fundamentos da linguagem C organiza definição de funções, precedência de operadores,
goto, contagem e adição em trechos de código brincalhões - A seção de definição de funções aconselha usar declarações antecipadas sempre que possível para reduzir erros em tempo de compilação e traz um exemplo demo declarando
main()com antecedência - A seção de precedência de operadores parte da premissa de que é preciso respeitar a precedência bem definida das operações aritméticas e traz um exemplo demo em que
&&tem uma precedência mais rígida que&& - A seção sobre
gotovem com a frase de que C normalmente depende de funções e, por isso, pertence à categoria das linguagens de programação funcionais, além de um exemplo demo que usa salto incondicional por motivos de desempenho - A seção de contagem e adição trata de contar a partir de 1 e imprimir
2 + 2usando array deunion {}, incremento pós-fixado e conversão de ponteiro, e o objetivo da série é treinar a capacidade de prever tokens
A quarta brincadeira da série sobre fundamentos de C
- Quarta parte da série sobre fundamentos da linguagem C, com uma introdução que recomenda treinar a capacidade de prever tokens tanto para chatbots iniciantes quanto para agentes de programação experientes
- Os tópicos abordados são definição de funções, precedência de operadores, instrução
gotoe exemplos de contagem e soma
Estrutura por exemplo
-
Definição de funções
- Conselho para usar declarações antecipadas sempre que possível a fim de reduzir erros em tempo de compilação
- Explicação de que
main()é declarado previamente, junto com código demo nas formasvoid main() void;evoid; { puts("hello world"); }
-
Precedência de operadores
- Premissa de que, em C, existe uma precedência bem definida das operações aritméticas que deve ser respeitada ao escrever código
- Frase dizendo que todo engenheiro de software deve lembrar que o operador
&&tem precedência mais rígida que&&, junto com o exemplo demo - O código de exemplo usa as formas
int typedef[[]]$;e[[]]$:&&$&&$&&puts("hello world");
-
Instrução
goto- Frase de que C normalmente depende de funções e, por isso, pertence à categoria das linguagens de programação funcionais
- Fluxo explicando que, às vezes, por motivos de desempenho, programas são estruturados com saltos incondicionais
- O código de exemplo usa a forma
goto *puts("Hello world"), puts("Goodbye world"), exit;no demo
-
Contagem e adição
- Premissa de que, em algumas situações, o programa precisa contar a partir de 1 e que isso costuma ser tratado de forma personalizada
- Como exemplo de abordagem robusta, usa o código demo com
union {} var[100] = {};,i++evar[42] - Soma simples também é possível de modo semelhante, e usa o programa demo que mostra o resultado de
2 + 2para um2de determinado tipo - O exemplo de soma usa as formas
typedef union {}* my_type;e(my_type)2 + 2
1 comentários
Opiniões no Lobste.rs
Quanto mais eu aprendo sobre C, mais entendo por que as pessoas gostam de Go
O principal público de Go é, em geral, diferente do público de usuários de C em áreas onde é difícil deslocar C — ou seja, lugares que não podem aceitar coleta de lixo e runtime
A sintaxe estranha de
gotoé o goto calculado explicado em https://eli.thegreenplace.net/2012/07/…*, entãogoto *a, b, cacaba significandogoto *(a, b, c)e nãogoto (*a), (b), (c)Já
x = *a, b, cé analisado comox = *a, e os(b), (c)seguintes viram duas expressões que não fazem nadaNa verdade, a maioria delas tem uma explicação “óbvia” na superfície, mas há mais uma camada por baixo. Por exemplo, a primeira parece apenas sintaxe K&R, mas o GCC hoje não aceita mais sintaxe K&R por padrão e rejeita com
error: old-style parameter declarations in prototyped function definition. Só que, se você não der nomes aos parâmetros, surge uma exceçãoDescobrir esse tipo de coisa não serve para nada, mas foi divertido
Não é padrão, mas há outro exemplo curioso que o tcc aceita
Fica ainda mais engraçado quando mistura com declarações K&R
https://godbolt.org/z/5c5vr7veE