Pues se aprende programando.
Es importante que pienses como el compilador: la máquina hará todo lo que le ordenes, sin "adivinar" ni "suponer" ABSOLUTAMENTE nada. El C da grandes libertades al programador y es lo más cercano a la máquina sin bajar a nivel de ensamblador.
Aunque los compiladores actualmente tienen buenos optimizadores de código, realizan advertencias de todo tipo, facilitan la visualización del código, etc. NO SON varitas mágicas. Su nivel de análisis semántico es muy reducido y casi nulo: NO ENTIENDEN LO QUE QUIERES HACER y se limitarán a producir código máquina del código C o C++ que escribiste, así sea todo lo contrario de lo que querías escribir.
Recuerda no hacer barbaridades si quieres codigo eficiente, por muy bueno que sea el optimizador si el codigo C o C++ de entrada no es bueno, pues los esfuerzos del optimizador serán en vano.
Asi que agarra un Open Source y si entiendes el código ve modificando el programa para ver los resultados que obtienes, claro se supone que los resultados esperados deberán ser iguales a los obtenidos.