From a classroom perspective, I'd agree (with the majority of answers/comments) that easier-to-understand is better. Most of the time, that'll probably be the correct answer to that classroom question. But many problems you eventually encounter doing (quoting your phrase) "professional coding" may have no such easy solution whatsoever. So what do you do then?
Ultimately, your easier-to-understand versus more-efficient is a false dichotomy. Good inline documentation is always the sine qua non that allows maintainers to come to grips with tens-of-thousands of lines of code they'd never seen before, and where the original developers of that code are long-since gone.
One aspect of good inline documentation is a large header comment block preceding each function, describing and discussing its purpose, calling sequence, side effects, algorithms, etc. For example, from my little lib of projection functions,
/* ==========================================================================
* Function: rotatetoz ( l, r, axis, nlines )
* Purpose: xlate, rotate l, returning r as though
* axis were along the z-axis with axis.pt1 at origin
* --------------------------------------------------------------------------
* Arguments: l (I) input LINE * to 3d-lines to be xlated, rotated
* along with axis
* r (O) output LINE * to xlated, rotated 3d-lines
* axis (I) LINE specifying rotation axis,
* with pt1 the tail, and pt2 the head,
* such that pt1 ends up at (0,0,0), and
* pt2 at (0,0,z=r) with r the length of axis
* nlines (I) int containing #lines to be rotated
* Returns: (double) r, the length of axis, or -1.0 for any error
* --------------------------------------------------------------------------
* Notes: o axis is (obviously) not changed, with r xlated, rotated as
* though axis pt1 was at the origin, and pt2 was at (0,0,z=r)
* o to accomplish this, first xlate pt1 of axis to (0,0,0),
* and then...
* z. As per usual spherical polar coords,
* | . x = r*cos(phi)*cos(theta)
* | . y = r*cos(phi)*sin(theta)
* | . z = r*sin(phi), where
* | o(x,y,z) r^2 = x^2 + y^2 + z^2
* |90-phi. |for r-axis
* | . | Then, to rotate axis to positive z-axis,
* | . | o rotate about z-axis by -theta
* |. | to bring axis to x,z-plane
* +--------|---y o rotate about y-axis by -(90-phi)
* / . | / to bring axis coincident with z
* /theta . | / Where we calculate
* / . |/ o sin(phi) = z/r
* x------------+ o sin(theta) = y/(r*cos(phi)) or
* cos(theta) = x/(r*cos(phi))
*
* ======================================================================= */
/* --- entry point --- */
double rotatetoz ( LINE *l, LINE *r, LINE axis, int nlines ) {
/* ---
* lots of code;
* ---------------- */
} /* --- end-of-function rotatetoz() --- */
And the code is itself extensively commented, frequently referring back to the above algorithm synopsis/explanation. That hopefully lets some future maintainers more easily figure out the decomposition of the somewhat-dense code into functional blocks. But there was never any "easier-to-read versus more-efficient" design choice possible. And there frequently never is.