I hear draw calls are expensive...so this is why I do this
They are. Culling unnecessary tiles is one way of solving this. Batching your calls together or instancing solves this another way without culling. They work wonders when combined.
On most hardware in most games, anyway. Yours may be different. Measure and quantify your inefficiencies before optimizing and afterward for comparison purposes.
1) Why is y first instead of x? And why are you using the pre-increment?
The code Spiro posted may just have a typo since he mixed Y with left/right and X with top/bottom, which is against usual convention. Y first is convention based on how images and arrays are laid out in memory. There are various mathematical and performance reasons this is "correct." It's not especially critical.
Pre-increment is a convention mostly used by C++ programmers. In a non-optimizing build, post-increment is a teeny tiny bit slower. For some C++ iterator types (not simple ints), it's measurably slower. Post-increment has to make a copy of the value before incrementing and then return the copy. An optimizing compiler will generally output identical machine code for both pre- and post-increment in cases like this even for complicated iterators, and certainly for any ints.
2) How do I know how many tiles my computer is capable of rendering?
It can render a lot. Do you mean per hour? Per second? Per frame at 60hz? Try drawing a few million. Measure the time it takes. Adjust as necessary until you drill into the number of tiles matching your target draw rate. Remember that this number is specifically for your computer and not any other.
Then remember that that is a best-case maximum and assumes you're doing no AI, physics, multitasking with a music player, etc., which will all slow down the device and reduce its draw rate.