1 pontos por GN⁺ 4 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • 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 goto vem 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 + 2 usando array de union {}, 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 goto e 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 formas void main() void; e void; { 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");
    Publicidade
  • 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++ e var[42]
    • Soma simples também é possível de modo semelhante, e usa o programa demo que mostra o resultado de 2 + 2 para um 2 de determinado tipo
    • O exemplo de soma usa as formas typedef union {}* my_type; e (my_type)2 + 2

1 comentários

 
GN⁺ 4 시간 전
Opiniões no Lobste.rs
  • Quanto mais eu aprendo sobre C, mais entendo por que as pessoas gostam de Go

    • Go não é um substituto para C. Zig é mais próximo disso.
      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/…

    • Isso mesmo. Mas, neste contexto, o mais estranho é que a vírgula parece ter precedência maior que *, então goto *a, b, c acaba significando goto *(a, b, c) e não goto (*a), (b), (c)
      x = *a, b, c é analisado como x = *a, e os (b), (c) seguintes viram duas expressões que não fazem nada
      Na 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ção
      Descobrir 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

    typedef int t();  
    t main { puts ("hello world"); };  
    

    Fica ainda mais engraçado quando mistura com declarações K&R

    typedef t(main);  
    t main t main; { t(main); }  
    

    https://godbolt.org/z/5c5vr7veE