Primeiro vamos explicar algumas coisas;
- No C, 0 é false, todo o resto é true.
- Toda String termina com o valor 0;
- A classe String não existe. O que existe é um ponteiro para o primeiro caracter de uma sequência;
- Você pode somar ponteiros. O que isso faz é adicionar ao endereço de memória o número de bytes correspondente ao tipo de dados do ponteiro.
Como str1 é um ponteiro para um char, somar 1 irá adicionar ao ponteiro o tamanho de um char (no caso 1 byte), deslocando para o próximo caracter da string.
Agora, vemos como funciona esse while:
*str1==*str2 --> Aqui que aqui não tem dúvida. Estou pegando o caracter apontado pelo ponteiro str1, e comparando com o caracter apontado pelo ponteiro str2.
*str1 --> Aqui usa-se um truque. Como a string é terminada com um caractere de valor 0, qualquer valor que o ponteiro aponte diferente disso é verdadeiro, e o while continua. Quando o while chegar ao caractere final da string, o valor será 0, e o while para.
*str2 --> A mesma coisa aqui.
Portanto, essa expressão é o mesmo que:
A soma dentro do while simplesmente pede para o c++ avançar para o próximo caracter.
Finalmente, temos o return. Esse return usa outro artifício.
Essa subtração só retorna 0, caso os dois caracteres sejam também o valor 0.
*str1 - *str2
Como 0 é false, e essa é a condição das strings serem iguais, negamos o valor no return.
Caso os caracteres sejam diferentes (que é a condição de parada do while), a subtração retornará um número positivo ou negativo. Isso, para todos os efeitos, é verdadeiro. E, ao ser negado, faz o método retornar false.