Sobre esto tenés que ver evaluaciones de expresiones, precedencia de operadores, y relaciones de expresiones en cortocircuito.
citando a CONCLASE.NET
http://c.conclase.net/curso/?cap=004c"Existe una regla que en muchas ocasiones nos puede resultar útil, ya que nos puede ahorrar tiempo y comprobaciones adicionales.
Esta regla se conoce como "cortocircuito" o "shortcut", y se aplica de forma diferente a expresiones AND y OR.
En el caso de operaciones AND, consiste en que si la primera expresión evaluada es false, la segunda ni siquiera se evalúa, ya que el resultado será siempre false independientemente del valor del segundo operando.
En el caso de operaciones OR, si la primera expresión sea true, la segunda no se evalúa, ya que el resultado será siempre true, independientemente del valor de la segunda expresión."
if (joystick_up() && joystick_left()&& joystick_select()) { return KEY_UP; }
________________________________________
|
|
si todo lo que está aqui dentro es verdadero se devuelve KEY_UP y como KEY_UP está declarado como un 1 con un define en el archivo user.h del proyecto PIC-LCD3310_TEST_DEMO, el compilador en realidad cambia el texto KEY_UP por un 1 por lo que ese trozo de código queda como return 1;
Es decir que si el resultado del if es verdadero se devuelve un 1.
//joystick definition
#define KEY_NONE 0
#define KEY_UP 1
#define KEY_DOWN 2
#define KEY_LEFT 3
#define KEY_RIGHT 4
#define KEY_CENTER 5
Definición de macros y expansiónHay dos tipos de macros: las que son como objetos y las que son como funciones. Las que se asemejan a funciones toman parámetros mientras que las que se asemejan a objetos no. La forma de definir un identificador como una macro de cada tipo es, respectivamente:
#define <identificador> <lista de tokens a reemplazar>
#define <identificador>(<lista de parámetros>) <lista de tokens a reemplazar>
Hay que tener en cuenta que no hay ningún espacio entre el identificador de la macro y el paréntesis izquierdo.
Cada vez que el identificador aparezca en el código fuente será reemplazado por la lista de tokens. Incluso si está vacía. Los identificadores declarados como funciones solo se reemplazan cuando se invoca con los parámetros con los que se definió la macro.
Las macros tipo objetos se usan normalmente como parte de prácticas de buena programación para crear nombres simbólicos para constantes. Por ejemplo:
#define PI 3.14159
en vez de utilizar el número tal cual en el código.
Un ejemplo de macro actuando como función es:
#define RADAGRA(x) ((x) * 57.29578)
Esta macro define la forma de convertir radianes a grados. Después podemos escribir RADAGRA(34). El preprocesador sustituirá la llamada a la macro por la multiplicación definida antes. Las macros aquí mostradas están escritas en mayúsculas. Esto permite distinguir fácilmente entre macros y funciones compiladas en el código fuente.
fuente:
http://es.wikipedia.org/wiki/Preprocesador_de_C