Yes, but that (specific) example is a great example of a waste of space in the vast, vast, vast majority of cases.
Let me show you examples of code that hides that whole iterator groadyness:
Python
for foo in Foos:
baz(foo)
Common Lisp:
(loop for foo in Foos
do
(baz foo))
Perl:
foreach my $foo (@Foos)
{
baz(foo);
}
C++ has a foreach construct as well, but it's a bit shoehorned. I'm relatively certain C# has some shorthand here for the same thing, and IIRC, it flows nicely.
There is no "Most likely", no "exception", it's very straightforward.
Rarely - very rarely - I care about the mechanisms of initialization, nexting, and termination. The rest of the time, (loop for var in list do) gets me by just fine.
* Macros change your program logically (as in not just perf improvements) prior to compilation. Not-macros do not. That's a big difference.*
It's no different than hunting through framework documentation.