While this is certainly more readable, it's not equivalent to the original code. at() performs bounds checking and is, therefore, slower.
I know that it is slower, but it shouldn't make any difference if it is only called in the preprocessor step.