Think about it "logically" (pun intended...):
You read a character. Say it's "A". You then compare it to both '\r' and '\n'.
char c = Serial.read();
if (c != '\r' || c != '\n') { // <- This line interesting
mAnswer[mAnswerLength] = c;
mAnswerLength++;
}
That is saying "If A is not CR or A is not LF then add it". Since it's A and not LF or CR then it's going to add it. Now imagine it's CR. "If CR is not CR or CR is not LF then add it". CR is CR, so the first part will be false. But CR isn't LF, so the second part is true. If it's OR, then if either part is true then it will be true. So since CR is not LF it will add it.
Now:
char c = Serial.read();
if (c != '\r' && c != '\n') { // <- This line interesting
mAnswer[mAnswerLength] = c;
mAnswerLength++;
}
That is saying "If A is not CR and A is not LF then add it". Since it's A and not LF or CR then it's going to add it. Now imagine it's CR. "If CR is not CR and CR is not LF then add it". CR is CR, so the first part will be false. But CR isn't LF, so the second part is true. Just as before. However, if it's AMD, then if BOTH parts are true then it will be true. So since CR is CR it won't add it.
In summary, the first one will ALWAYS be true since one half is always going to be true. The second one will ONLY be true if BOTH parts are true. So the first one just plain isn't going to do what you want.