Serial.available()

-No line ending

You should change this to one of the other options. The others act like periods at the end of sentences, or spaces after words, to tell you where a stream of data breaks in meaningful ways.

if i enter "567", the Serial.print function returns "5";

Yes, and no. The Serial.print() function returns 1, because it printed one character. The character read was a '5', because there were 3 characters to read.

characters are sent to Arduino one by one, so when the first digit is sent, the if statement goes like that: "the first char enter the Arduino buffer. Now the Arduino buffer contains >= 3 elements? = NO! and so on, until i enter"7".

Again, yes and no. The characters are sent one by one. The test does evaluate to false because the characters arrive one by one, and for several thousands of iterations of loop, the '5' has arrived, but the '6' and '7' have not.

Only when the '6' and '7' arrive does the test evaluate to true.

But, while you are entering the characters one by one, the Serial Monitor sends them only when you hit the enter key/send icon.

Now Arduino buffer contains 3 or more elements so 'if loop' is triggered, and Serial.read reads the first element stored in the buffer, that is "5"! Printing the element (Serial.available) left in the buffer, the answer is "2", and that is trivial...

Yes. You are printing the number of elements left in the buffer, though, not the elements left in the buffer.

You really should get in the habit of identifying EVERYTHING printed to the serial port.

if(Serial.available() >= 3)
{
   char c = Serial.read();
   Serial.print("I read a [");
   Serial.print(c);
   Serial.println("]");

   Serial.print("The buffer still contains ");
   Serial.print(Serial.available());
   Serial.println(" characters");
}