Here's an example to make it clear
shell program file
# case 1
for i in $@;
do echo $i
done
# case 2
for i in "$@";
do echo $i
done
When executed this is the output
$ bash p1.sh a b "c d"
a
b
c
d
a
b
c d
What happens is that the bash shell that is invoking, the interactive shell first
splits the parameters into tokens. Next the quotes are removed ( see https://www.gnu.org/software/bash/manual/html_node/Quote-Removal.html#Quote-Removal )
What is passed to the program p1.sh is this quoteless list of tokens
In the first case what is really happening is
for i in a b c d;
in the second case
for i in "a" "b" "c d";
The third token gets to the program as cSPACEd. I'm writing the literal space character (ASCII 0x20) as SPACE
But unless the quotes are used to interpolate it the SPACE is seen by the command as a separator between tokens and so cSPACEd becomes a pair of tokens instead of one token