Dicas de programação (C/C++, Java)
January 9, 2008É raro eu publicar algo sobre programação neste blog, não é? Acho que na verdade este é o primeiro post de programação que não é link para algum site com dicas, técnicas ou algoritmos. Nesse breve texto, o que quero expôr são três coisas que uso no dia-a-dia. Embora básicas, nem todo mundo sabe de suas existências ou não está acostumado a usá-las no código. Portanto, se você pegar algum código meu, é provável que você encontre o seguinte:
1) Operador shift-left << e shift-right >>
Todos falam que divisão é uma operação cara para o computador, certo? Então porque não usar operadores de deslocamento de bits? Algo que uso bastante em jogos é calcular a metade da largura da tela, mas ao invés de realizar uma divisão por 2, faço um shift-right por 1.
// idem à screenWidth / 2 int halfScreenWidth = screenWidth >> 1
Pense no shift-right como uma divisão por 2^n. Como usei o valor 1 no exemplo, estou realizando uma divisão por 2^1 = 2. Caso eu precisasse de 1/4 da largura da tela, faria screenWidth >> 2.
Já o shift-left é como uma multiplicação por 2^n. Mas e se eu precisar multiplicar um número por 13? Qual número que 2 elevado a esse número resulta em 13? Nenhum. Então decompomos o 13 em potências de 2:
// Multiplicar result = anyvalue * 13 // 2^3 = 8, 2^2 = 4, 2^0 = 1... 8 + 4 + 1 = 13 int result = (anyvalue << 3) + (anyvalue << 2) + anyvalue;
2) ++, –, +=, -=, *=, /=, etc…
Em algumas linguagens de programação sei que não existem tais operadores para incremento/decremento de variáveis, mas em C/C++, Java (e ActionScript) eles existem.
// Ao invés de... anyvar = anyvar + 1; // Podemos usar... anyvar ++; // Assim como... anyvar = anyvar * 3; // Fica... anyvar *= 3;
3) Operador ternário ? (sÃmbolo interrogação)
Creio que o código abaixo é comum em alguns projetos:
// Supondo que já declaramos um int counter = 0;
counter ++;
if(counter < 10) {
counter = 0;
}
O operador ? pode substituir o if, como no código abaixo:
// Supondo que já declaramos um int counter = 0; counter = (counter >= 10) ? 0 : counter + 1;
Pense assim. Eu quero zerar a variável counter quando ela chegar ou passar de 10. Enquanto isso não acontece, aumento seu valor de um em um. O ternário ? é como uma pergunta: “A variável counter é maior ou igual a 10? Sim, então zera ela. Não? Então aumente seu valor.” Ou seja, quando a condição antes do sÃmbolo de interrogação for verdadeira, use o valor antes dos dois pontos. Quando for falsa, use o valor depois dos dois pontos.
Note que com o operador ? verifico se counter é maior ou igual a 10, dada a ordem de execução do código.Admito que minha explicação não está detalhada e talvez seja melhor você fazer uma pesquisa para entender melhor esses conceitos. Mas espero que para os iniciantes em programação eu tenha trazido um conhecimento a mais.
Atualização: leia o primeiro comentário do VinÃcius nesse post, sobre os operadores ++ e — em C++. E uma coisa que ele mencionou e que eu acabei esquecendo de escrever aqui: eu acostumei a programar desse jeito (apesar que não é sempre que faço isso) porque comecei na época do MS-DOS em que realmente algumas otimizações eram válidas. Hoje há quem diga que certas otimizações ficam piores que as mesmas feitas por compiladores e eu não vou discordar disso :-). Mas mesmo assim, ainda temos aplicações em que fazemos coisas como nos velhos tempos (por exemplo, fixed-point math para dar suporte à celulares MIDP 1.0, já que não possuem float).

2 comentários para “Dicas de programação (C/C++, Java)”
// Comment by vinigodoy (January 09, 2008 – 2:45 pm):
Olá André.
Foi uma surpresa saber que você mexia com programação!!!
Alguns compiladores já conseguem otimizar divisões por potências de dois e transforma-las em shifts. Além disso, muitos processadores já tem ULAs mais avançadas, e reduziram muito o custo da divisão. Eu geralmente não sou adepto de otimizações como essa, exceto em último caso. Mas é bom saber que elas existem, se o “último caso” chegar.
Eu uso muito o operador ternário também. No inÃcio, a sintaxe dele é um pouco estranha, mas certas expressões ficam mesmo muito mais simples com ele. O exemplo que você passou foi ótimo e é um caso realmente tÃpico.
Quanto aos operadores, acho que é bom também lembrar que existe o ++ antes e depois da variável e que em alguns casos um pode ser mais eficiente que outro. É o caso, no C++, da iteração de uma lista usando um for, através dos iterators. Fazer ++it é mais eficiente do que it++. E nesse caso, a diferença é significativa, já que o iterator é um objeto e não um tipo primitivo.
No geral, muito bom o artigo!
E é bom saber que alguém ligado ao game designer, também vê o lado da peonada que implementa os jogos por aqui! 
// Comment by vinigodoy (January 09, 2008 – 2:52 pm):
PS: Depois de muito tempo lendo o blog é que acabei entrando aqui e vendo a sua biografia. Muito legal.
É um dos males do reader.