&& ("E" lógico)
Verdadeiro apenas se os dois operandos forem verdadeiros, ou seja a primeira condição "e" a segunda forem verdadeiras, e.g.
if (digitalRead(2) == 1 && digitalRead(3) == 1) { // ler dois interruptores
// ...
}
é verdadeiro apenas se os dois interruptores estiverem fechados.
Verdadeiro se algum dos operandos for verdadeiro, ou seja se a primeira "ou" a segunda condição for verdadeira e.g.
if (x > 0 || y > 0) {
// ...
}
é verdadeiro apenas se x ou y forem maiores que 0.
Verdadeiro apenas se o operando for falso e.g.
if (!x) {
// ...
}
é verdadeiro apenas se x for falso (i.e. se x for igual a 0).
Cuidado
Certifique-se de não confundir o operador booleano "E" representado por "&&" e o operador lógico de bits "E" representado apenas por "&". Eles são animais completamente diferentes. Do mesmo modo não confunda o booleano "OU" representado por "||" e o operador lógico de bits "|". O operador lógico de bits "NÃO" representado por um "~" não se parece com o operador booleano "!", mas mesmo assim tenha certeza de estar usando o que você deseja.
Exemplo
if (a >= 10 && a <= 20){} // verdadeiro se a estiver entre 10 e 20